.net 出于性能分析目的,是否可以忽略对WaitHandle.SignalAndWait的调用?

.net 出于性能分析目的,是否可以忽略对WaitHandle.SignalAndWait的调用?,.net,performance,multithreading,profiling,waithandle,.net,Performance,Multithreading,Profiling,Waithandle,我刚刚下载了的试用版,正在调查我团队的一些代码。我立即注意到,ANTS报告的代码中有一部分占用了99%的CPU时间 一般来说,我对ANTS或性能评测完全不熟悉(也就是说,除了使用非常粗糙的自评测之外,我还不赞成使用诸如double-timeToComplete=(endTime-startTime).TotalSeconds等方法),所以我仍然在摆弄应用程序,弄清楚它是如何使用的。但我确实打电话给负责讨论中代码的开发人员,他立即的反应是“是的,它这么说并不让我感到惊讶;但代码调用SignalAn

我刚刚下载了的试用版,正在调查我团队的一些代码。我立即注意到,ANTS报告的代码中有一部分占用了99%的CPU时间

一般来说,我对ANTS或性能评测完全不熟悉(也就是说,除了使用非常粗糙的自评测之外,我还不赞成使用诸如
double-timeToComplete=(endTime-startTime).TotalSeconds等方法),所以我仍然在摆弄应用程序,弄清楚它是如何使用的。但我确实打电话给负责讨论中代码的开发人员,他立即的反应是“是的,它这么说并不让我感到惊讶;但代码调用SignalAndWait[我自己可以看到,多亏了ANTS],它不使用任何CPU,只是坐在那里等着做些什么。”他建议我干脆忽略这些代码,然后寻找其他我能找到的东西

我的问题:SignalAndWait是否确实不需要CPU开销(如果需要,这是怎么可能的?),性能分析器认为它占用99%的CPU时间是否合理?我觉得这特别奇怪,因为如果它是99%,这将表明我们的应用程序经常处于空闲状态,不是吗?但它的表现最近变得相当缓慢


正如我所说的,对于这个工具,我只是一个初学者,我对WaitHandle类一无所知。因此,如果有任何信息能帮助我理解这里发生的事情,我将不胜感激。

一个WaitHandle确实会让你的线程进入睡眠状态

额外的好处是,您可以设置这些手柄的超时,以便它们可以在一段时间后醒来

您还可以从另一个线程(例如应用程序退出等)向WaitHandle发送信号,然后它们立即被唤醒


我个人更喜欢具有短超时的WaitHandle而不是线程。使用相同的超时睡眠,因为当睡眠开始时,它必须返回才能恢复操作,而如果需要,WaitHandle可以立即恢复。

我认为您的代码中可能存在严重的错误。 EventWaitHandle根据其重置模式有2种语义。 当EventWaitHandle处于自动重置模式时,所有等待的线程都会被阻塞,直到事件发出信号为止。一旦事件发出信号,随后对其执行的等待操作将重置其状态,并再次对其执行调用等待块的线程

但是,如果EventWaitHandle处于手动复位模式,它将保持信号,直到您在其上手动调用重置,这意味着如果一个EnviaWITHANDLE被发出信号,并且一个线程在一个紧密的循环中调用它等待,这个线程将不会阻塞,直到在事件上手动调用重置,所以考虑这个虚构场景

EventWaitHandle h1, h2;
h1 = new EventWaitHandle(true, EventWaitHandle.ManualReset); // the event is already signaled.
h2 = new EventWaitHandle(false, EventWaitHandle.ManualReset);
while(true)
{
  WaitHandle.SignalAndWait(h2,h1);
}
上面的循环将占用大部分CPU,直到其他线程调用h1.Reset(),这将导致SignalAndWait阻塞

希望这有帮助

有关更多信息,请查看