[英]Does QueueBackgroundWorkItem actually queue background work?
我們正在運行ASP.NET WebAPI 2服務,我們希望使用記錄器將一些請求記錄到電子郵件/數據庫中。
因為它是后台工作,並且因為我認為在asp.net中,我們應該使用HostingEnvironment.QueueBackgroundWorkItem
在后台運行它。
我希望所有日志都井井有條-令我驚訝的是,我找不到任何表明QueueBackgroundWorkItem
實際上保證排隊的工作項按順序運行或表明沒有按順序運行的信息。
所以,我的問題是: QueueBackgroundWorkItem
是否保證排隊的工作按順序執行?
HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("A"));
HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("B"));
我是否知道上面代碼段的輸出始終是:
A
B
還是會出現故障?
文檔中似乎沒有任何契約性內容。
查看參考源,似乎使用了一個名為BackgroundWorker
的類來實際執行這些任務。
反過來,這似乎正在ThreadPool
上運行任務,並且明確地可能並行執行多個任務:
public void ScheduleWorkItem(Func<CancellationToken, Task> workItem) {
Debug.Assert(workItem != null);
if (_cancellationTokenHelper.IsCancellationRequested) {
return; // we're not going to run this work item
}
// Unsafe* since we want to get rid of Principal and other constructs specific to the current ExecutionContext
ThreadPool.UnsafeQueueUserWorkItem(state => {
lock (this) {
if (_cancellationTokenHelper.IsCancellationRequested) {
return; // we're not going to run this work item
}
else {
_numExecutingWorkItems++;
}
}
RunWorkItemImpl((Func<CancellationToken, Task>)state);
}, workItem);
}
因此,我想假設兩個排隊的任務將以什么順序完成是不安全的。
QueueBackgroundWorkItem保證排隊的工作按順序執行
來自HostingEnvironment.QueueBackgroundWorkItem的引用
新的HostingEnvironment.QueueBackgroundWorkItem方法,可用於安排小型后台工作項。 ASP.NET跟蹤這些項目,並防止IIS突然終止工作進程,直到所有后台工作項目均已完成。 這些將使ASP.NET應用程序能夠可靠地調度異步工作項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.