【问题标题】:Stop successful await task停止成功的等待任务
【发布时间】:2017-01-22 23:55:10
【问题描述】:

我正在使用 async/await Task 来避免 wpf UI 被阻塞并使我的应用程序响应更快。以下是我在应用程序中应用 async/await 的方法:

private async void Button1_Click(object sender, RoutedEventArgs e)
{
      .......

      try
      {
            await Task.Run(() =>
            {
                  ......
            });
      }

      catch (Exception ex)
      {
            ......
      }    
}

如果Taskcatch 执行中返回错误,我是否需要停止/取消它?如果“任务”成功运行且没有错误或捕获到任何异常,我是否还需要在我的应用程序的其他位置停止/取消 Task

【问题讨论】:

    标签: c# wpf user-interface asynchronous async-await


    【解决方案1】:

    如果您在catch 块中,则任务已经停止执行。

    【讨论】:

      【解决方案2】:

      如果任务在 catch 执行中返回错误,我是否需要停止/取消任务?

      • 不,您只能使用 CancellationTokenSource 停止/取消,如果绝对需要作为显式操作(逻辑的一部分),而不是异常/成功运行,它们都会传播回调用者。

      在这种情况下,它实际上可以使用 void,作为 async button click event,因为 UI 知道如何处理异常(如果它传播)

      但是,请理解您代码的另一个方面,如下:

      await Task.Run(() =>
                  {
                        ......
                  });
      

      将在ThreadPool thread 上启动Async 调用,现在您不能使用它来更新任何UI 控件,这将导致InvalidOperationException,这需要在UI 线程上完成,即standard synchronization contextAsync 通话

      【讨论】:

        【解决方案3】:

        如果“任务”成功运行且没有错误或捕获到任何异常,我还需要在应用程序的其他位置停止/取消任务吗?

        任务只完成一次。

        如果已经完成(成功或有异常),则不能取消。

        【讨论】:

          猜你喜欢
          • 2014-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多