QueueBackgroundWorkItem实际上是否对后台工作进行排队

本文关键字:排队 工作 后台 实际上 是否 QueueBackgroundWorkItem | 更新日期: 2023-09-27 18:17:58

我们正在运行一个ASP。. NET WebAPI 2服务,我们想用我们的记录器记录一些请求到email/database。

因为它是后台工作,因为在asp.net中我认为我们应该使用HostingEnvironment.QueueBackgroundWorkItem在后台运行它。

我希望我的日志都是有序的-令我惊讶的是,我找不到任何表明QueueBackgroundWorkItem实际上保证排队的工作项按顺序运行或指示它不是的东西。

所以,我的问题是:QueueBackgroundWorkItem是否保证排队的工作按顺序执行?
 HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("A")); 
 HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("B"));
我知道上面代码片段的输出总是:
A
B

还是它出了问题?

QueueBackgroundWorkItem实际上是否对后台工作进行排队

文档中似乎没有任何合同内容。

查看参考源代码,它似乎使用了一个名为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应用程序可靠地调度异步工作项。