QueueBackgroundWorkItem实际排队后台工作吗?

时间:2015-10-15 07:23:30

标签: c# asp.net asp.net-web-api2

我们正在运行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"));

或者它可能出现故障?

2 个答案:

答案 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工作项。

相关问题