代码之家  ›  专栏  ›  技术社区  ›  Jeff Cyr

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

  •  0
  • Jeff Cyr  · 技术社区  · 16 年前

    我希望能够做到以下几点:

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

    我怀疑.Net框架是否有这种能力,但是有没有一种技术可以通过pinvoke实现这一点?我需要它是可能的低开销。

    2 回复  |  直到 16 年前
        1
  •  2
  •   donovan    16 年前

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

    去年我在PDC,参加了Joe Duffy关于并行性的一些演讲,这些演讲非常有趣。我记得他说的是在.NET中提供一个可扩展的线程池类,因为MSFT通常会发现,当人们去编写自己的线程池时,他们大部分时间都可以很好地工作,但在边缘情况下会被各种问题所困扰。通过提供一种可扩展性机制,他们希望限制开发人员被抓住的可能性。

        2
  •  0
  •   Michael    16 年前

    更新:

    您可以启用 context switch events 在ETW中,并通过 ProcessTrace . OldThreadId和OldThreadState将说明线程停止运行的原因(转换为就绪、备用、等待等)。NewThreadId将在线程开始运行时告诉您。您将必须为处理事件 每一个 系统中的上下文切换。这将是难以置信的高容量,在您的进程中消耗大量CPU,并且很难精确地得到正确的结果。