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

Sya*_*hya 13 c# wpf multithreading tap task-parallel-library

例

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

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

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

nos*_*tio 23

使用.NET 4.5(或.NET 4.0 + Microsoft.Bcl.Async),最好的方法是使用Task基于API的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更多阅读:

如何在WPF后台执行任务,同时能够提供报告并允许取消?

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

异步和等待.

异步/等待常见问题.

  • 在这种特定情况下,使用“Thread.Sleep”来模拟大量同步 CPU 密集型工作,该工作将被卸载到池线程(而不是创建延迟)。这就是问题所在。 (2认同)

Nic*_*ico 5

最好的方法是使用a BackgroundWorker.

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

我建议看几个BackgroundWorker的例子.

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

这是我前一段时间关于取消后台工作人员的帖子之一/sf/answers/1465875071/

最后.Asyncronous并不意味着多核甚至多线程.(WIKI)