等待异步方法中已完成的任务

长寿

当我们调用异步方法时,我们返回一个包装器任务。

public async Task ExecuteActionAsync() {
  // no await called
}
public async Task ExecuteActionAwaitAsync() {
  // await called on a completed
  await Task.CompletedTask;
}
public async Task MyMethod(){
  await ExecuteActionAsync();
  await ExecuteActionAwaitAsync();
}

如果我从未await在函数(ExecuteActionAsync)中使用关键字,或者在ExecuteActionAwaitAsync我们等待它们时所有在函数()中等待的任务已经完成,那么我是否可以保证通过调用这些方法返回的任务将处于完成状态?并且递归地,由它返回的任务MyMethod也将处于完成状态,因为它满足了前面提到的条件(等待完成的任务)。我相信我已经读到了可以解决这种情况的优化方法,但是现在无法在任何地方找到它。

额外的问题:调用Task.WhenAll完成的任务是否会返回完成的任务?

约翰·多恩(Johan Donne)

这很容易测试:

        var t1 = ExecuteActionAsync();
        Console.WriteLine($"Returned task: {t1.IsCompleted}");
        await t1;
        Console.WriteLine($"Awaited task: {t1.IsCompleted}\n");

        var t2 = MyMethod();
        Console.WriteLine($"Returned task: {t2.IsCompleted}");
        await t2;
        Console.WriteLine($"Awaited task: {t2.IsCompleted}\n");

        t1 = ExecuteActionAsync();
        t2 = MyMethod();

        var t3 = Task.WhenAll(new []{t1,t2 });
        Console.WriteLine($"Task from WhenAll: {t3.IsCompleted}");

结果:

Returned task: True
Awaited task: True

Returned task: True
Awaited task: True

Task from WhenAll: True

因此:是的,如果async方法同步运行,则返回的Task已完成。是的,从WhenAll返回的传递同步运行的异步方法的任务也已完成。

Stephen Cleary撰写了有关此主题的有用博客具体来说,以下引用是相关的:

异步方法的开始就像其他方法一样被执行。也就是说,它会同步运行,直到达到“ await”(或引发异常)为止。

“ await”关键字是事物可以异步进行的地方。Await就像一元运算符:它接受一个参数,一个awaitable(“ awaitable”是一个异步操作)。Await检查该等待项是否已经完成;如果等待已完成,则该方法将继续运行(与常规方法一样同步)。

规范方面着手解决问题

  • 异步方法必须返回“等待”类型(例如“任务”),该类型必须具有“ IsCompleted”属性
  • “ IsCompleted属性的目的是确定任务是否已完成。如果已完成,则无需暂停评估。”

从这些语句可以得出结论,同步运行的异步方法确实会返回完成的Task。

即使在执行async方法时引发异常,返回的Task也将完成(“ IsCompleted”将返回“ true”,尽管“ IsCompletedSuccessfully”将返回“ false”)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

使使用异步/等待的IObservable <T>以原始顺序返回已完成的任务

来自分类Dev

等待任务完成异步httpwebrequest

来自分类Dev

从列表<任务>中删除已完成的任务

来自分类Dev

异步/等待方法中的耗时任务

来自分类Dev

异步/等待方法中的耗时任务

来自分类Dev

等待异步方法完成

来自分类Dev

等待完成异步方法

来自分类Dev

确保Firebase中的异步操作已完成

来自分类常见问题

等待与task.Result相同的已完成任务?

来自分类Dev

在 rails 中找出已完成的任务

来自分类Dev

异步执行多个任务并等待它们完成

来自分类Dev

Angular-等待异步任务完成

来自分类Dev

使异步收集等待所有任务完成

来自分类Dev

等待dispatch_semaphore以等待许多异步任务完成的正确方法

来自分类Dev

等待dispatch_semaphore以便等待许多异步任务完成的正确方法

来自分类Dev

异步方法中返回和等待任务之间的区别

来自分类Dev

异步方法中返回和等待任务之间的区别

来自分类Dev

启动异步任务而不等待它完成,但检查完成

来自分类Dev

我应该如何等待GCD中并行异步任务的完成?

来自分类Dev

任务中的等待方法

来自分类Dev

查看已完成的 Elasticsearch 任务

来自分类Dev

如何等待运行异步方法的任务

来自分类Dev

如何使Parallel等待所有异步任务完成?

来自分类Dev

如何获取异步代码以等待所有任务完成?

来自分类Dev

如何等待异步方法中的等待完成所有执行?

来自分类Dev

等待两个异步方法完成