簡體   English   中英

Asp.Net中Task.Run和QueueBackgroundWorkItem之間的區別

[英]Difference between Task.Run and QueueBackgroundWorkItem in Asp.Net

究竟有什么區別

Task.Run(() => { 
     LongRunningMethod();
});

要么

HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());

我在Asp.Net MVC應用程序上進行了測試,在該應用程序中,我在使用Task.Run或QBWI調用的異步任務中繼續在文本文件中寫入一行約10分鍾。

使用Task和QBWI都可以。 我的異步方法一直寫入該文件,直到10分鍾沒有任何問題。 我沒有觀察到IIS對其回收的干擾。

那么QueueBackgroundWorkItem有什么特別之處呢?

文檔有一個很好的解釋:

與普通的ThreadPool工作項不同, ASP.NET可以跟蹤當前正在運行的通過此API注冊的工作項數,並且ASP.NET運行時將嘗試延遲AppDomain關閉,直到這些工作項完成執行。 無法在ASP.NET管理的AppDomain之外調用此API。 當應用程序關閉時,將提供所提供的CancellationToken信號。

Task.Factory.StartNew根本不會注冊ASP.NET運行時。 你運行你的代碼10分鍾,沒有任何區別。 IIS回收發生在IIS預設的特定時間。 如果您真的想測試最新情況,可以嘗試強制回收

下面的文章解釋了類似於你正在做的事情,如果你進入最后一節“幾點思考......”,你會看到兩者之間突出的區別

http://codingcanvas.com/using-hostingenvironment-queuebackgroundworkitem-to-run-background-tasks-in-asp-net/

基本上它說使用queuebackgroundworkitem任務是在ASP.Net運行時注冊的,如果進程關閉或崩潰,ASP.NET運行時仍然會給進程完成一些寬限期。它還涉及向進程發送通知以便它可以結束並執行任何完成任務,而當您使用Task.Run時,所有這些都不可用

AppDomain關閉只能延遲90秒(實際上是HttpRuntimeSection.ShutdownTimeout和processModel shutdownTimeLimit的最小值)。 如果排隊的項目太多而無法在90秒內完成,則ASP.NET運行時將卸載AppDomain而不等待工作項完成。

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

暫無
暫無

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

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