我有兩套任務的,每一個不同的結果類型:如何將Task.WhenAll()用於不同返回類型的多個列表?
IEnumerable<Task<T1>> set1 = GetTasksOfT1();
IEnumerable<Task<T2>> set2 = GetTasksOfT2();
現在我想在一行中等待兩集,但我不得不項目設置1採用鑄造:
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);
'T1'和'T2'都堅持一個共同的接口嗎? –
@YuvalItzchakov號 –
@ Clockwork-Muse請參閱我的編輯。但是,使用阻塞方法'Task.WaitAll()'是一個很糟糕的建議。 –