是否有人知道在特定线程被暂停和恢复时获得通知的方法?
我希望能够做到这样的事情:
thread.Suspended += delegate
{
//Do something
};
thread.Resumed += delegate
{
//Do something else
};
我怀疑.Net Framework是否具备此功能,但有没有一种技术可以通过pinvoke实现这一目标?我需要它可以低开销。
答案 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,并且很难准确地正确。