【发布时间】:2012-07-13 22:04:19
【问题描述】:
我有一个方法使用后台工作程序来轮询 DLL 的状态,如下所示:
var timeout = DateTime.Now.AddSeconds(3);
while (System.Status != Status.Complete // our status is not complete
&& DateTime.Now < timeout // have not timed out
&& !_Worker.CancellationPending) // backgroundworker has not been canceled
{
//Thread.Yield();
//Thread.SpinWait(1);
//Thread.Sleep(1);
}
查看我的 CPU % 时,yield() 和 spinwait() 会导致我的应用在我的 PC 上运行高达 50%。使用Sleep(1),我的 CPU 百分比保持在 6%。有人告诉我,我应该选择Thread.Yield(),但是 CPU 百分比的峰值困扰着我。这种情况的最佳做法是什么?
【问题讨论】:
-
您是否考虑在此轮询过程中使用
Threading.Timer?如果您使用的是 .NET 4.0,则可以将其与 TPL 混合以进行基于任务的协作取消。 -
我猜你的电脑上有 2 个内核。其中一个是 100% 忙...
-
为什么只使用后台工作人员来等待它?这违背了所有常识。如果您需要,为什么 DLL 不提供一种明智的方式来等待操作完成?
-
+1 @DavidSchwartz 建议使用有效的信号而不是浪费 CPU 和延迟的轮询(还有很多,AutoResetEvent、Semaphore 等)。
-
@poco tl;dr 你被告知错。
标签: c# multithreading sleep yield