c# - 只要其中任何一个完成,就使用异步调用的结果(具有不同的返回类型)?
问题描述
下面的代码开始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);
推荐阅读
- json - 如何使用 Json Schema Validator 在特定条件下执行长度检查验证?
- testing - 'JacocoTaskExtension' 不存在于 jdk11 、 AGP 7.0.+ 和 ,Gradle 7.0.+
- python - 'NoneType' 对象在计算梯度时没有属性 'outer_context 错误(更快的 rcnn)
- python - 使用 xpath 查看要抓取的特定元素
- css - 如何在日用品之间设置更大的空间?
- json - 散景 Websocket 关闭连接:JSON 输入意外结束
- java - Project Loom 早期访问 IDE
- ubuntu - Ubuntu 20 打破了我的 arm-none-eabi-g++ 设置
- node.js - MongoDB:服务器实例池被破坏的问题
- sql - is not null 不消除空值