gpt4 book ai didi

c# - 对传递给 Task.WhenAll() 的任务使用 ConfigureAwait(false) 失败

转载 作者:IT王子 更新时间:2023-10-29 04:37:04 26 4
gpt4 key购买 nike

我正在尝试决定如何等待所有异步任务完成。

这是我目前的代码

[HttpGet]
public async Task<JsonResult> doAsyncStuff()
{
var t1 = this.service1.task1();
var t2 = this.service2.task2();
var t3 = this.service3.task3();
var t4 = this.service4.task4();

await Task.WhenAll(t1,t2,t3,t4);
return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet);
}

我很确定同步上下文不相关,所以我尝试了这个。

[HttpGet]
public async Task<JsonResult> doAsyncStuff()
{
var t1 = this.service1.task1().ConfigureAwait(false);
var t2 = this.service2.task2().ConfigureAwait(false);
var t3 = this.service3.task3().ConfigureAwait(false);
var t4 = this.service4.task4().ConfigureAwait(false);

await Task.WhenAll(t1,t2,t3,t4);
return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet);
}

现在的问题是 Task.WhenAll 的参数无效,因为它不会接受已配置的任务等待表。

所以Task.WhenAll需要换成这个

await t1; await t2; await t3; await t4;

这对我来说似乎不正确,但实际上任何人对 ConfigureAwait 的看法都是“如果它没有出错,就使用它”。据我所知(我没有编写任务),他们不使用同步上下文,也不依赖它。

重要的是要注意我希望 task1 到 task4 同时运行,因为它们不依赖于前一个完成。因此,我不想在每个任务前等待。但是我不想在所有 4 个完成之前返回 Json 响应,这就是为什么我目前在当前代码中有 await Task.WhenAll() 的原因。

最佳答案

当你真正执行await时,你只需要ConfigureAwait,正确的形式是

[HttpGet]
public async Task<JsonResult> doAsyncStuff()
{
var t1 = this.service1.task1();
var t2 = this.service2.task2();
var t3 = this.service3.task3();
var t4 = this.service4.task4();

await Task.WhenAll(t1,t2,t3,t4).ConfigureAwait(false);
return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet);
}

关于c# - 对传递给 Task.WhenAll() 的任务使用 ConfigureAwait(false) 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30670856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com