簡體   English   中英

.NET 4.5 Async + Await Fire並忘記潛在的內存泄漏?

[英].NET 4.5 Async + Await Fire and Forget potential memory leak?

我在下面使用類似的代碼在ASP.NET中進行非關鍵的“即發即棄”操作

private void SomeMethod()
{
    FireAndForgetAsync();
}

private async Task FireAndForgetAsync()
{
    // Simulate medium running IO blocking operation
    await Task.Delay(sleepTime).ConfigureAwait(false);

    // Simulating the rare scenario where an error occurs
    throw new Exception("An Error Occurred");
}

從異步方法返回的任務中捕獲異常,這可以防止未處理的異常導致應用程序崩潰。

但是這段代碼會導致任何內存泄漏嗎? 因為未分配/訪問返回的Task(及其異常)? 我的想法是它只是垃圾收集,除非一些.NET框架代碼持有對任務的引用。

代碼中沒有內存泄漏的風險。 至少從你提供的片段。

但是,由於未處理的異常,在完成任務時,CLR可能會終止您的應用程序。

如果您創建了一個Task,並且您沒有調用task.Wait()或嘗試檢索Task的結果,那么當垃圾收集器收集任務時,它將在最終確定期間拆除您的應用程序。 有關詳細信息,請參閱MSDN的TPL中的異常處理頁面。

Reed Copsey的答案

對此有多種解決方案/解決方法。 您可以在此SOF帖子中找到有關此內容的更多信息: 通過等待任務或訪問其Exception屬性未觀察到任務的異常。 結果,未觀察到的例外是

(正如I3arnon所提到的,這種行為在.Net 4.5中有所改變。)

您的代碼中沒有內存泄漏的危險。 只要任務結束(它有),就沒有什么能阻止垃圾收集器收集它。 如果你發射了不尋常的那些任務,你可能會使用大量的內存,但它們會被GCed。

如果這些任務不會結束(如果他們有一段while (true)例如))或者如果你保持對它們的引用,那么就有可能發生內存泄漏。


正如評論中所提到的那樣。 非常不鼓勵使用“火與忘記”和async-await

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM