gpt4 book ai didi

c# - 一旦其中任何一个完成,就使用异步调用(具有不同返回类型)的结果?

转载 作者:行者123 更新时间:2023-12-02 08:46:11 24 4
gpt4 key购买 nike

以下代码开始T1Async()T2Async()T3Async()T4Async()并等待所有调用完成,然后再消耗这些调用的结果。但是,运行这些异步调用的时间可能随机地很短或很长。

Task<int> T1Async() { };
Task<string> T2Async() { };
Task<ClassX> T3Async() { };
Task<ClassY> T4Async() { };

var t1 = T1Async();
var t2 = T2Async();
var t3 = T3Async();
var t4 = T4Async();

var v1 = await t1;
var v2 = await t2;
var v3 = await t3;
var v4 = await t4;
// Or Task.WhenAll(new Task[] { t1, t2, t3, t4 });

UseV1(v1); // Want these calls be run asap
UseV2(v2);
UseV3(v3);
UseV4(v4);

UseAll(v1, v2, v3, v4); // Need all the result here

如何在调用完成后立即消费结果并确保所有结果都被消费?

最佳答案

因此,您希望并行执行 UseVX 任务,但等待所有结果(不同类型),以便将其传递给 UseAll 方法。

使用Task.Run

var t1 = Task.Run(async () => { var x = await T1(); UseV1(x); return x; });
var t2 = Task.Run(async () => { var x = await T2(); UseV2(x); return x; });
var t3 = Task.Run(async () => { var x = await T3(); UseV3(x); return x; });
var t4 = Task.Run(async () => { var x = await T4(); UseV4(x); return x; });
await Task.WhenAll(t1, t2, t3, t4);
UseAll(t1.Result, t2.Result, t3.Result, t4.Result);

使用ContinueWith

var t1 = T1().ContinueWith(x => { UseV1(x.Result); return x.Result; });
var t2 = T2().ContinueWith(x => { UseV2(x.Result); return x.Result; });
var t3 = T3().ContinueWith(x => { UseV3(x.Result); return x.Result; });
var t4 = T4().ContinueWith(x => { UseV4(x.Result); return x.Result; });
await Task.WhenAll(t1, t2, t3, t4);
UseAll(t1.Result, t2.Result, t3.Result, t4.Result);

关于c# - 一旦其中任何一个完成,就使用异步调用(具有不同返回类型)的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833887/

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