【问题标题】:TPL: check if task was faulted in OnCompleted eventTPL:检查任务是否在 OnCompleted 事件中出错
【发布时间】:2016-10-27 15:37:23
【问题描述】:

我有一个类似的任务:

var migrateTask = Task.Run(() =>
    {
        //do stuff
     });

migrateTask.ConfigureAwait(true).GetAwaiter().OnCompleted(this.MigrationProcessCompleted);

如何在方法 MigrationProcessCompleted 中判断我是否在初始线程中遇到异常或任务出错(在 do stuff 代码块中)?

有没有办法在不将任务设为类成员/属性的情况下找到它?

【问题讨论】:

  • 为什么你得到等待者而不使用Task.ContinueWith?
  • 因为我需要在 UI 线程中执行 MigrationProcessCompleted
  • 你能用await吗?
  • 是的,我可以使用。这是我第一次体验任务。

标签: c# task-parallel-library task


【解决方案1】:

您永远不应该真正调用.GetAwaiter(),它是供编译器使用的。

如果你可以使用await,你的代码就这么简单

public async Task YourFunc()
{

    Exception error = null
    try
    {
        await Task.Run(() =>
        {
            //do stuff
         });
    }
    catch(Exception ex)
    {
        error = ex;
    }

    MigrationProcessCompleted(error)
}

private void MigrationProcessCompleted(Exception error)
{
     //Check to see if error == null. If it is no error happend, if not deal withthe error.
}

【讨论】:

  • 这样的话,在run块里面的代码抛出异常,会不会被catch块捕获呢?因为听说异常发生的时候不会抛出...
  • await 导致它被 catch 块捕获。如果你在没有await 的情况下完成了Task.Run,那么你是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多