实施例
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或其他)答案 0 :(得分:23)
使用.NET 4.5(或.NET 4.0 + Microsoft.Bcl.Async),最好的方法是使用基于Task
的API和async/await
。它允许使用方便(伪)顺序代码工作流并具有结构化异常处理。
示例:
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);
}
}
更多阅读:
How to execute task in the WPF background while able to provide report and allow cancellation?
<强> Async in 4.5: Enabling Progress and Cancellation in Async APIs 强>
答案 1 :(得分:5)
执行此操作的最佳方法是使用BackgroundWorker
。
我指出这一点的原因是它专门用于在后台处理工作,同时保持UI线程的可用性和响应性。它还内置Progress
次通知并支持Cancellation
。
我建议您查看 BackgroundWorker 的几个示例。
现在,当你开始调查后台工作人员时,你需要深入了解一点Cancellation
。设置后台工作程序的取消属性不会取消后台工作程序,这只会为您的运行方法引发一个标志,以便定期间隔并优雅地停止处理。
以下是我前一段时间关于取消后台工作人员的帖子https://stackoverflow.com/a/20941072/1397504
最后。 Asyncronous并不意味着多核甚至多线程。 (WIKI)
答案 2 :(得分:1)
您可以使用BackgroundWorker类在WPF中的单独线程上执行操作。
请查看此示例How to use WPF Background Worker
在这里阅读MSDN上的课程 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx