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
还是它出了问题?
文档中似乎没有任何合同内容。
查看参考源代码,它似乎使用了一个名为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应用程序可靠地调度异步工作项。