我们正在运行ASP.NET WebAPI 2服务,我们希望使用我们的记录器将一些请求记录到电子邮件/数据库。
因为它的后台工作,并且因为在asp.net中我认为我们应该使用admin/projects/5
在后台运行它。
我希望我的所有日志都按顺序排列 - 令我惊讶的是,我找不到任何表明HostingEnvironment.QueueBackgroundWorkItem
实际上保证排队的工作项按顺序运行或表明它没有完成的事。
所以,我的问题是:QueueBackgroundWorkItem
是否保证排队的工作按顺序执行?
QueueBackgroundWorkItem
我是否知道上述代码段的输出始终为:
HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("A"));
HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("B"));
或者它可能出现故障?
答案 0 :(得分:2)
文档中似乎没有任何合同。
查看参考源,它似乎使用一个名为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);
}
所以我说,假设两个排队任务的顺序完成,这是不安全的。
答案 1 :(得分:0)
QueueBackgroundWorkItem保证按顺序执行排队工作
来自HostingEnvironment.QueueBackgroundWorkItem
的参考资料New HostingEnvironment.QueueBackgroundWorkItem方法,可让您安排小型后台工作项。 ASP.NET跟踪这些项目并阻止IIS突然终止工作进程,直到所有后台工作项都完成。这些将使ASP.NET应用程序可以可靠地安排Async工作项。