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

时间:2014-01-24 07:12:41

标签: c# wpf multithreading task-parallel-library tap

实施例

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. 支持多线程和多核

3 个答案:

答案 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

Async and Await

Async/Await FAQ

答案 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