如何从子线程或其他线程获取父线程?

时间:2011-02-28 13:49:07

标签: .net multithreading winapi

  

可能重复:
  .NET Is there a way to get the parent thread id?

.NET中的线程之间是否存在任何关系?我迫切需要从实际线程中获取父线程,并且无法切换这条信息。 有没有办法在.NET中使用父线程或使用Win32 API?

有没有办法从任何其他线程获取父线程?

5 个答案:

答案 0 :(得分:9)

.NET不记录线程之间的父子关系。您需要通过在创建时将父线程传递给子项来自行跟踪这些数据。

那就是说,我无法想象你为什么需要这个。不是父母的Join还是足够好的东西?

我可以理解你可能会因为“无论如何你想做什么?”这样的问题而感到沮丧。 - 但有时候如果你让我们知道你的真正目标是什么,我们可能会找到一个你没想到的更好的方法。 :)

答案 1 :(得分:4)

在Win32中,线程没有父线程。线程都归进程所有。

答案 2 :(得分:3)

线程本身在.NET框架上具有父/子关系。这是因为在Win32中,所有线程都归进程所有。

你可以通过在线程周围创建一个包装类来自己强加这种关系。但是,由于信息很少,我不推荐解决方案。

答案 3 :(得分:1)

.NET中的Threads之间没有任何关系。但是,在.NET 4的Task / Task<T>类中存在父子关系,这在很多方面是比直接使用线程更好的并发方法。

有人说......

  

我迫切需要从实际线程中获取父线程,并且无法移交这条信息。

将信息“移交”给线程的主要方法是实现SynchronizationContext。这通常由用户界面框架完成,以便在该线程内的对象上实现ISynchronizeInvoke(即:Control.Invoke)。这通常不是手动完成的,并且需要一个非常自定义的线程来维护它自己的消息传递泵或正在不断处理的进程队列。

我建议考虑将此更改为生产者/消费者方案,并让您的“子”线程轮询新的处理项目。这消除了所有需要知道“父母”的需要 - 因为任何线程都可以添加到处理队列中。 BlockingCollection<T>类非常适合此场景。

答案 4 :(得分:-2)

使用InvokeRequired在主线程中执行某些操作。