2017-03-29 17 views
1

如果它不返回任何東西,是否需要等待異步任務函數?這會導致下面的代碼包裝在委託中,並在異步任務函數返回後執行?如果我不在意它的返回值,我應該等待「異步任務」函數嗎?

Task DoSomethingAsync() 
{ 
    return Task.Run(() => 
    { 
     // Do something, but doesn't return values. 
    }); 
} 

void Test() 
{ 
    DoSomethingAsync(); // should I await? 

    // Do other things, totally not related to the async function 
    Console.WriteLine("aaa"); 
} 

在上面的例子中,如果我在等待測試(DoSomethingAsync()),將導致下面的代碼Console.WriteLine被包裹在委託和僅推遲執行時異步任務完成?

+0

我看不出理由。 – Trey

+1

如果你這樣調用它,它將同步運行。 – dcg

+2

@dcg不,它不會。它會在它完成之前繼續。 – Servy

回答

1

如果你不這樣做,並且你的程序在任務完成之前退出,那麼你就搞砸了。在允許退出之前,您至少要等待所有/任何這些任務。如果您不知道未等待的人何時完成,您還應該考慮同時運行的這些任務的多個實例的任何含義。例外情況也不能依賴於向呼叫者冒泡。

一個更好的辦法可能是隨時聽候在頂層調用者只在最新的可能的時候,等待着,當你真的需要(例如,如果應用程序即將退出)

您的問題有關Console.WriteLine - 是的,它只會在完成後打印,如果您等待上一行。如果您不等待,它將與在任務中執行的代碼競爭。

3

如果它不返回任何東西,是否需要等待異步任務函數?

一般來說,是的。這不僅允許你在檢測到它時完成,它還允許你對任何錯誤作出響應。如果您願意,您可以稍後存儲Task對象和await

等待任務是「射後不理」,字面意思是:

  • 你不在乎它是否完成。
  • 你不在乎什麼時候完成。
  • 你不在乎它是成功還是失敗。

這是非常罕見的有一個真正的防火和忘記的情況。

這會導致下列代碼被包裝在委託中並在異步任務函數返回後執行嗎?

異步函數返回的Task完成後,是的。