使用Task.Delay而不是Application.DoEvents

Dan*_*gen 1 c#

好吧,我想知道Task.Delay使用Application.DoEvents是否更好?

示例代码:

private async void NonBlockingWaitAwhile(int milliseconds)
{
    Stopwatch sWatch = Stopwatch.StartNew();

    while (sWatch.Elapsed.Milliseconds <= milliseconds)
    {
        await Task.Delay(50);
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

private void WaitAwhile(int milliseconds)
{
    Stopwatch sWatch = Stopwatch.StartNew();

    while (sWatch.Elapsed.Milliseconds <= milliseconds)
    {
        Application.DoEvents();
    }
}
Run Code Online (Sandbox Code Playgroud)

那么哪种方法更好(特别是我听说使用Application.DoEvents可能会导致错误,因为它会释放应用程序可能执行的所有待处理事件)

Ste*_*ary 5

Task.DelayDoEvents它避免重入更好.

但是,最好的解决方案是不使用它们.延迟只有少数有效用途,例如限制重试.绝大多数时间我都看到了延迟,这是错误的(例如,当正确的方法是解决实际问题时,编码人员正在使用它来避免竞争条件或解决尴尬的架构).

  • 正确.您可以快速入侵`Task.Delay`并让它工作,或者您可以选择提供更正确的解决方案.:) (3认同)
  • 另请注意,`DoEvents`版本将CPU调到100%,因为它是一个繁忙的循环.这只会加剧你的问题,因为你现在正在挨饿程序的其他部分,大概你正在等待解决.这是管理员的计算机版本,每5分钟停一次,要求更新状态报告. (3认同)