【问题标题】:Proper way to delay code execution in a background worker在后台工作人员中延迟代码执行的正确方法
【发布时间】:2014-02-12 14:01:39
【问题描述】:

好的,我一直在阅读 Thread.Sleep、Task.Delay、AutoResetEvent ...等方面的内容

我看到很多争论,因为这取决于正在执行的任务。

我目前在所有事情中都使用 Thread.Sleep,并认为我需要开始避免它并使用更好的做法。

这是一个包含 BackgroundWorker 的客户端应用程序。 Worker 每 30 分钟运行一次,以检查来自 Web 服务的更新数据。

然后它会更新位于 MainWindow 中的 3 个 int 变量。这些对 UI 没有任何作用。它们仅用于检查正在运行的其他工作人员。

一种延迟方式比另一种更好吗?

如果用户退出应用程序并且我正在调用 Application.Current.Shutdown(),它会继续运行直到 Thread.Sleep 完成,还是即使线程处于睡眠状态它也会退出?

【问题讨论】:

  • 为什么不使用定时器而不是睡眠/后台工作人员?
  • Dispatcher.BeginInvoke(DispatcherPriority.Background,...);

标签: c# wpf multithreading


【解决方案1】:

结合使用 Task、await 和 CancellationTokenSource 以便能够在后台运行、等待而不浪费线程并取消。

类似:

var cancel = new CancellationTokenSource();
App.OnShutdown += (s,e) => cancel.Cancel();
await Task.Delay(1000,cancel.Token);

【讨论】:

  • 这对于这种情况非常有意义。由于 Task.Delay() 本身使用计时器和取消令牌,因此立即中止等待是完全有意义的。 +1
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多