2014-06-06 30 views
7

在Stack Overflow问题和一些Google搜索问题上搜索后,我仍然没有得到它。我知道你可以使用“Thread.isAlive()”方法检查单个线程是否正在运行,但是我想检查一个特定的“FooThread”是否仍然在当前进程的所有正在运行的线程之间运行,如果没有,请调用启动它的方法。从ProcessThreadCollection获取正在运行的线程名称

//somewhere in the code, on another Project/DLL inside solution 
private void FooThreadCaller() 
{ 
    Action act =() => fooFunction(); 
    Thread t = new Thread(new ThreadStart(act)); 
    t.Name = "FooThread"; 
    t.Start(); 
} 
//... 
Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
ProcessThreadCollection threads = proc.Threads; 
bool ThreadExists = false 
foreach (ProcessThread item in threads) 
{ 
    // if item.Name == "FooThread", then ThreadExists = true... 
    // so, if !ThreadExists then call FooThreadCaller() and so on. 
} 
//... 

由于ProcessThread类没有一个 “名称” 属性(如System.Threading.Thread一样),但只有ID,我只知道线程名(“FooThread “)不是ID,我如何检查”FooThread“是否正在运行/活着?

预先感谢您

+1

即使这是可能的,它不会是一个好主意。如果线程刚刚退出,您会认为它仍在运行。这本质上是活泼的。跟踪这些信息。当FooThread关闭时,不要。当它开始时,请注意。 – usr

+2

你正在做一些非常非常错误的事情。任何“一个仍在运行测试的线程”都是没用的,它可能不会在纳秒后运行。好东西它不起作用。 –

+2

这些评论很棒,但值得指出的是OP实际上检查线程是否*运行。 – Slider345

回答

5

正如在其他答案中所提到的,ProcessThread和Thread对象是不同的。你的dll创建它自己的Thread对象,但是它会抛弃它对该对象的引用。然后稍后您将查询该线程的操作系统(通过System.Diagnostics),并期待您之前作为该线程的创建者具有相同级别的访问权限。

相反,您应该在创建它们时保存对线程对象的引用。也许你的DLL可以实现一个公共的静态集合对象,然后你可以在创建它们时添加线程对象。

然后在你的dll外面,你可以遍历集合并检查每个线程的名称和状态。

+1

谢谢@ Slider345。我会检查一下。 –

2

我不认为有一种方法可以做到这一点。 A ProcessThread代表OS线程。 A Thread代表应用程序内的管理的线程。两者之间并没有真正的关系。此外,ThreadProcessThread的映射不是1:1,因为ProcessThread可以表示多个Thread

3

ProcessThread代表操作系统级别的线程,而Thread代表.Net管理的线程。操作系统级别的线程没有名称而是唯一的ID(就像进程一样)。

而不是检查当前线程的列表如果您的线程仍在运行,您可能应该更改您的代码的逻辑。例如,您可以保留一个包含线程状态的布尔值,并在开始/结束时更新它。

相关问题