【问题标题】:Task.Delay vs Thread.Sleep for suspending System.Timers.Timer's jobTask.Delay vs Thread.Sleep 用于暂停 System.Timers.Timer 的工作
【发布时间】:2018-10-25 09:26:33
【问题描述】:

我已经开始讨论:在循环中暂停 System.Timers.Timer 的工作 1 秒,Task.Delay 或 Thread.Sleep 使用什么更好???

这里是样例:

timer.Elapsed += (sender, args) =>
{
  for (int i = 0; i < 15; i++)
  {
    Thread.Sleep(1000);
    if (Connection.IsAlive) return true;
  }
};

请帮我解决问题:)

【问题讨论】:

  • 当你尝试这两种方法时发生了什么?
  • 如果您正在利用异步等待,那么使用 await Task.Delay 您不必阻塞线程。如果那段代码将同时被击中,我会考虑它,否则我可能不会打扰。
  • 你如何定义哪个“更好”?
  • “更好”的意思是——正确的 :)

标签: c# multithreading performance task


【解决方案1】:

这取决于你的目标是什么。

Thread.Sleep 将阻塞正在使用的系统线程。默认情况下 System.Timers.Timer 使用系统线程池,这意味着您不会阻塞主线程,并且使用 Thread.Sleep 可能 将与程序的其余部分同时执行。如果您希望使用(并因此阻止)特定线程,则需要使用 SynchronizingObject 属性,并与 Thread.Sleep 配合使用。

Task.Delay 将提供逻辑延迟而不阻塞当前线程。这是最好的方法,除非您有理由阻止特定线程。请记住,您需要使事件处理程序异步才能使用Task.Delay

 timer.Elapsed += async (sender, args) =>
    {
         for (int i = 0; i < 15; i++)
         {
            await Task.Delay(1000);
            ...
         }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多