在WPF应用程序中执行后台任务

private void Start(object sender, RoutedEventArgs e) { int progress = 0; for (;;) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } } 

如果我想要Start(),推荐的方法是什么(TAP或TPL或BackgroundWorker或Dispatcher或其他)

  1. 不要阻止ui线程
  2. 可以提供进度报告
  3. 可以取消
  4. 支持multithreading和多核

使用.NET 4.5(或.NET 4.0 + Microsoft.Bcl.Async ),最好的方法是使用基于Task的API和async/await 。 它允许使用方便(伪)顺序代码工作流并具有结构化exception处理。

例:

 private async void Start(object sender, RoutedEventArgs e) { try { await Task.Run(() => { int progress = 0; for (; ; ) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } }); } catch (Exception ex) { MessageBox.Show(ex.Message); } } 

更多阅读:

4.5中的异步:在异步API中启用进度和取消

异步和等待 。

异步/等待常见问题 。

执行此操作的最佳方法是使用BackgroundWorker

我指出这一点的原因是它专门设计用于在后台处理工作,同时保持UI线程可用和响应。 它还内置了Progress通知并支持Cancellation

我建议看几个BackgroundWorker的例子。

现在,当你开始研究后台工作者时,有一点Cancellation ,你将不得不深入挖掘。 设置后台工作程序的取消属性不会取消后台工作程序,这只会为您的运行方法引发一个标志,以便定期进行interogate并正常地停止处理。

这是我前一段时间关于取消后台工作人员的post之一https://stackoverflow.com/a/20941072/1397504

最后。 Asyncronous并不意味着多核甚至multithreading。 ( WIKI )

您可以使用BackgroundWorker类在WPF中的单独线程上执行操作。

检查此示例如何使用WPF后台工作程序

并在这里阅读MSDN上的类http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx