[英].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.