2017-10-10 167 views
5

我有以下場景/需求:C#async/await - 一個首選的多任務

我有兩個任務,任務A和任務B,它們都返回相同類型的數據。 如果任務A在完成時在其結果中有數據,則需要返回任務A的結果 - 否則我將返回任務B的結果。

我試圖將性能優化爲平行度,我不確定是否有比我所做的更好的方法。這看起來像很多代碼來做我想做的事情。

var firstSuccessfulTask = await Task.WhenAny(taskA, taskB); 
if (firstSuccessfulTask != taskA) 
{ 
    await taskA; 
} 

if (taskA.Result != null) 
{ 
    return taskA.Result; 
} 

return await taskB; 
+3

爲什麼不直接調用的結果'第一等待taskA'並跳過'Task.WhenAny'打電話? – EJoshuaS

回答

12

只需按照您的要求閱讀的方式編寫代碼即可。返回A的結果,除非它爲空,在這種情況下,返回B.

return await taskA ?? await taskB; 
+3

直到taskA完成後纔開始taskB的執行,有效地使它們成爲串行而不是並行? –

+2

@PaulGelardi如果'taskB'實際上是一個當你調用該表達式時啓動任務的屬性,那麼是的。如果它是一個已經啓動任務的本地/字段,那麼沒有。考慮到命名約定,以及你反覆使用'taskA'的事實(因此每次你使用它時都不會創建新的任務,因爲如果你的代碼根本不起作用),這很明顯,它們都是變量,而不是計算新任務的表達式。如果它們真的是計算新任務的表達式,則需要先將其存儲在局部變量中,然後執行此操作。 – Servy

+0

這是有道理的。我沒有意識到任務B在我調用異步方法時立即開始執行 - 我認爲它在等待某個東西, 或等待它時纔開始執行。 –