在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或其他)
- 不要阻止ui线程
- 可以提供进度报告
- 可以取消
- 支持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