.NET有没有办法获得父线程ID?

时间:2010-11-18 11:59:27

标签: c# .net multithreading

假设主线程正在生成一个新线程t1,我在t1上运行的代码如何找到主线程的线程ID(使用c#)?

编辑:
我不控制新线程的创建。所以我不能将任何参数传递给线程。

感谢。

4 个答案:

答案 0 :(得分:10)

你不能。

但你可能会考虑:

  1. 使用父线程
  2. 中的线程ID作为新线程的名称的前缀
  3. 在要生成的方法上创建一个构造函数,该构造函数需要来自父
  4. 的线程ID

答案 1 :(得分:2)

如果你只有两个线程而第二个线程是后台线程,你可以枚举进程中的所有线程,并通过阅读Thread.IsBackground property来消除后台线程。不是很漂亮,但也许你需要什么?

您可以阅读有关foreground and background threads on MSDN的更多信息。

答案 2 :(得分:0)

我不知道你是否有一个属性可以做到这一点,但你可以在你的线程中添加一个新的参数传递给它。这将是我能想到的最简单的方式......

答案 3 :(得分:0)

如果您使用的是Threadpool(因此此处无法控制线程的创建),则可以按以下方式工作:

private static void myfunc(string arg)
{
    Console.WriteLine("Thread "
                     + Thread.CurrentThread.ManagedThreadId
                     + " with parent " + Thread.GetData(Thread.GetNamedDataSlot("ParentThreadId")).ToString()
                     + ", with argument: " 
                     + arg
                     );
}
public static int Main(string[] args)
{
    var parentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
    WaitCallback waitCallback = (object pp) =>
    {
        Thread.SetData(Thread.GetNamedDataSlot("ParentThreadId"), parentThreadId);
        myfunc(pp.ToString());
    };

    ThreadPool.QueueUserWorkItem(waitCallback, "my actual thread argument");
    Thread.Sleep(1000);
    return 0;
}

这将产生类似的内容:

 Thread 3 with parent 1, with argument: my actual thread argument

但是,如果根本无法将数据传递到子线程,请考虑重命名父线程或所有子线程。