gpt4 book ai didi

c# - QueueBackgroundWorkItem 实际上是否在排队后台工作?

转载 作者:行者123 更新时间:2023-12-05 06:43:32 28 4
gpt4 key购买 nike

我们正在运行 ASP.NET WebAPI 2 服务,我们希望使用我们的记录器将一些请求记录到电子邮件/数据库中。

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

我希望我的日志全部有序 - 令我惊讶的是,我找不到任何迹象表明 QueueBackgroundWorkItem 实际上保证排队的工作项目按顺序运行或表明它没有。

所以,我的问题是:QueueBackgroundWorkItem 是否保证排队的工作按顺序执行?

 HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("A")); 
HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("B"));

我知道上面片段的输出总是:

A
B

或者它可能是乱序的?

最佳答案

文档中似乎没有任何契约(Contract)内容。

查看引用源,它似乎使用了一个名为 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);
}

所以我想说,假设两个排队的任务完成的顺序是不安全的。

关于c# - QueueBackgroundWorkItem 实际上是否在排队后台工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33142328/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com