.Net如何在线程被挂起时有效地获得通知?

时间:2009-12-02 02:09:15

标签: c# .net multithreading pinvoke

是否有人知道在特定线程被暂停和恢复时获得通知的方法?

我希望能够做到这样的事情:

thread.Suspended += delegate
{
    //Do something
};

thread.Resumed += delegate
{
    //Do something else
};

我怀疑.Net Framework是否具备此功能,但有没有一种技术可以通过pinvoke实现这一目标?我需要它可以低开销。

2 个答案:

答案 0 :(得分:2)

如果您致力于编写自己的线程池,这可能没有帮助,但我会尝试坚持使用.NET ThreadPool类并根据需要使用SetMaxThreads / SetMinThreads和GetMaxThreads / GetAvailableThreads进行调整。有什么特别的理由说这不够好吗?

去年我在PDC参加并参加了Joe Duffy关于并行性的一些讨论非常有趣。我记得他在谈论在.NET中提供一个可扩展的线程池类,因为MSFT通常会发现,当人们去编写自己的线程池时,他们大部分时间都会正常工作,但是在各种陷阱中被边缘情况所困扰。通过提供可扩展性机制,他们希望限制开发人员陷入困境的可能性。

答案 1 :(得分:0)

Windows没有针对Thread.Suspend / Thread.Resume的这种通知机制你不应该使用Thread.Suspend / Thread.Resume - 它很容易导致死锁和其他难以发现的bug。使用普通的同步原语(锁,事件等)使线程阻塞,直到它有工作要做。

更新:

您可以在ETW中启用context switch events并通过ProcessTrace使用它们。 OldThreadId和OldThreadState将告诉线程停止运行的原因(转换为就绪,待机,等待等等)。 NewThreadId会在线程开始运行时告诉你。您必须处理系统中每个上下文切换的事件。这将是令人难以置信的高容量,在您的过程中消耗大量的CPU,并且很难准确地正确。