簡體   English   中英

QueueBackgroundWorkItem是否實際上將后台工作排隊?

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

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