gpt4 book ai didi

c# - 如何将 Task.WhenAll() 用于多个不同返回类型的列表?

转载 作者:太空狗 更新时间:2023-10-30 01:33:04 26 4
gpt4 key购买 nike

我有两组任务,每组都有不同的结果类型:

IEnumerable<Task<T1>> set1 = GetTasksOfT1();
IEnumerable<Task<T2>> set2 = GetTasksOfT2();

现在我想在一行中等待两个集合,但我不得不用 cast 投影 set1:

 await Task.WhenAll(set1.Select(p => p as Task).Concat(set2));

那是因为如果我不使用转换会出现此错误:

IEnumerable<Task<T1>>' does not contain a definition for 'Concat' 
and the best extension method overload 'Queryable.Concat<Task<T2>>(IQueryable<Task<T2>>, IEnumerable<Task<T2>>)'
requires a receiver of type 'IQueryable<Task<T2>>'

这是显而易见的。

那么有没有一种方法可以在不强制转换的情况下使用单个 WhenAll() ?

编辑:返回类型 T1 和 T2 很重要 - 我在等待任务后使用它们:

//After await Task.WhenAll(...):
var t1Results = await set1; // all set1 Tasks are completed by now
var t2Results = await set2; // same
DoSomethingWithResults(t1Results, t2Results);

最佳答案

实际上,编译器只是提示类型推断失败。你可以帮助它:

IEnumerable<Task<int>> set1 = null;
IEnumerable<Task<string>> set2 = null;

set1.Concat((IEnumerable<Task>)set2); //#1
((IEnumerable<Task>)set1).Concat(set2); //#2
set1.Concat<Task>(set2); //#3

还有许多其他方法可以提供类型信息。这是有效的,因为 IEnumerable是协变的。这将调用 Enumerable.Concat<Task>(IEnumerable<Task>, IEnumerable<Task>) .

关于c# - 如何将 Task.WhenAll() 用于多个不同返回类型的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34973709/

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