gpt4 book ai didi

c# - 一次启动多个 async/await 函数并分别处理它们

转载 作者:太空狗 更新时间:2023-10-29 18:06:46 26 4
gpt4 key购买 nike

如何同时启动多个 HttpClient.GetAsync() 请求,并在它们各自的响应返回时立即处理它们?首先我尝试的是:

var response1 = await client.GetAsync("http://example.com/");
var response2 = await client.GetAsync("http://stackoverflow.com/");
HandleExample(response1);
HandleStackoverflow(response2);

但当然它仍然是顺序的。所以我尝试同时启动它们:

var task1 = client.GetAsync("http://example.com/");
var task2 = client.GetAsync("http://stackoverflow.com/");
HandleExample(await task1);
HandleStackoverflow(await task2);

现在任务同时启动,这很好,但是代码当然还是要一个接一个地等待。

我想要的是能够在收到“example.com”响应后立即处理,并在收到“stackoverflow.com”响应后立即处理。

我可以将这两个任务放在一个数组中,然后在一个循环中使用 Task.WaitAny(),检查哪个任务完成并调用适当的处理程序,但是……这比只是常规的旧回调?或者这真的不是 async/await 的预期用例吗?如果没有,我将如何使用带有回调的 HttpClient.GetAsync()

澄清一下——我所追求的行为类似于这样的伪代码:

client.GetAsyncWithCallback("http://example.com/", HandleExample);
client.GetAsyncWithCallback("http://stackoverflow.com/", HandleStackoverflow);

最佳答案

你可以使用ContinueWithWhenAll来等待一个新的Task,task1和task2会并行执行

var task1 = client.GetAsync("http://example.com/")
.ContinueWith(t => HandleExample(t.Result));

var task2 = client.GetAsync("http://stackoverflow.com/")
.ContinueWith(t => HandleStackoverflow(t.Result));

var results = await Task.WhenAll(new[] { task1, task2 });

关于c# - 一次启动多个 async/await 函数并分别处理它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12932102/

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