从ProcessThreadCollection获取名称的运行线程

时间:2014-06-06 15:01:33

标签: c# .net multithreading process

在搜索Stack Overflow问题和一些谷歌搜索后,我仍然没有得到它。

我知道您可以使用“Thread.isAlive()”方法检查单个线程是否正在运行,但是我想检查特定的“FooThread”是否仍在当前进程的所有正在运行的线程之间运行,并且如果没有,请调用启动它的方法。

//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类没有“Name”属性(如System.Threading.Thread那样)但只有ID,而我只知道线程名称(“FooThread”)而不是ID,我怎么检查“FooThread”正在运行?

提前谢谢

3 个答案:

答案 0 :(得分:6)

如其他答案中所述,ProcessThread和Thread对象是不同的。你的dll正在创建它自己的Thread对象,但是它抛弃了它对该对象的引用。然后,您将查询该线程的操作系统(通过System.Diagnostics),并期望获得与线程创建者相同的访问级别。

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

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

答案 1 :(得分:3)

ProcessThread表示操作系统级线程,而Thread表示.Net托管线程。操作系统级线程没有名称,只有一个唯一ID(就像进程一样)。

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

答案 2 :(得分:2)

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