簡體   English   中英

你必須等待異步方法嗎?

[英]Do you have to await async methods?

假設您有一個服務API調用。 被調用者在某種程度上對性能至關重要,因此為了不長時間地阻止API調用,需要使用SaveAsync()方法。 但是,我不能await它,因為這會阻止API調用與非異步版本一樣長(或者甚至更長)。

我問的原因是:如果你沒有 await調用,返回的Task對象是否有可能被垃圾回收? 如果是這樣,會中斷正在運行的任務嗎?

我問的原因是:如果你沒有等待調用,返回的Task對象是否有可能被垃圾回收?

一般來說,不,這不應該發生。 對任務進行排隊的底層TaskScheduler通常會在完成之前保持對其所需生命周期的引用。 您可以在TaskScheduler.QueueTask的文檔中看到:

典型的實現將任務存儲在內部數據結構中,該內部數據結構將由將在未來某個時間執行這些任務的線程提供服務。

您真正的問題將出現在ASP.NET SynchronizationContext上,它會在運行時跟蹤任何正在進行的異步操作。 如果您的控制器操作在異步操作之前完成,那么您將獲得異常。

如果您想在ASP.NET中進行“即發即忘”操作,則應確保通過HostingEnvironment.QueueBackgroundWorkItemBackgroundTaskManager將它們注冊到ASP.NET運行時。

不,它不會中斷正在運行的任務,但你也不會從任務中看到異常,這不是很好。 您可以(至少部分地)通過將所有正在運行的代碼包裝在try ... catch並避免記錄異常來避免這種情況。

此外,如果您在asp.net中,那么您的整個應用程序可能會被停止或回收,在這種情況下,您的任務將被中斷。 這很難避免 - 您可以注冊AppPool關機通知,或使用像Hangfire這樣的東西

暫無
暫無

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

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