2014-02-12 17 views
3

好了,所以我一直对了Thread.Sleep,Task.Delay,的AutoResetEvent读了...等有道推迟执行代码在后台工作

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

我目前使用Thread.Sleep,并认为我需要开始避免它,并使用更好的做法。

这是一个包含BackgroundWorker的客户端应用程序。该工作人员每30分钟运行一次以检查Web服务的更新数据。

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

是一种比另一种更好的延迟方法吗?

如果用户退出应用程序,并且调用Application.Current.Shutdown(),它会继续运行,直到Thread.Sleep完成,否则即使线程正在休眠,它也会退出吗?

+2

为什么不使用反对睡眠/后台工作定时器吗? – Jason

+0

Dispatcher.BeginInvoke(DispatcherPriority.Background,...); –

回答

4

使用Task,await和CancellationTokenSource的组合可以在后台运行,等待而不浪费线程,并取消。

喜欢的东西:

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

这对于这种情况非常有意义。由于Task.Delay()本身使用计时器,并且取消令牌可以立即中止等待。 +1 – vendettamit