对于异步方法,我是否应该将异步与 ASP.NET QueueBackgroundWorkItem 方法一起使用?[复制]

Should I use async with the ASP.NET QueueBackgroundWorkItem method for an async method? [duplicate]

提问人:Gary 提问时间:4/3/2023 最后编辑:Gary 更新时间:4/3/2023 访问量:54

问:

使用 QueueBackgroundWorkItem 时,以下两种调用执行异步操作(如 API 调用)的方法的方法有什么区别吗?

HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken =>
{
    var result = await LongRunningMethodAsync();
});

或以下内容:

HostingEnvironment.QueueBackgroundWorkItem(cancellationToken => LongRunningMethodAsync()); 

我知道为什么对 QueueBackgroundWorkItem 使用异步?但他们似乎关注的是调用 LongRunningMethod 的异步版本与同步版本是否更好,并且不清楚上述内容是否会产生任何影响。

我目前在我的 Web 应用程序中使用第二种方法,并且可以看到我的异步操作实际上似乎运行异步。

C# asp.net 多线程异 async-await

评论


答:

0赞 Guru Stron 4/3/2023 #1

文档中

与普通 ThreadPool 工作项的不同之处在于,ASP.NET 可以跟踪通过此 API 注册的工作项数当前正在运行,并且 ASP.NET 运行时将尝试延迟 AppDomain 关闭,直到这些工作项完成执行。

因此,区别在于,第一个任务将导致计划任务被 ASP.NET 监视,直到完成,而第二个任务将触发,从 ASP.NET 的角度来看,工作项将被视为已完成(请参阅源代码,两者都将实际创建一个任务并将其安排在自定义计划程序 - BackgroundWorkScheduler 上)。LongRunningMethodAsyncLongRunningMethodAsyncQueueBackgroundWorkItem

所以我认为在这种情况下,第一个更可取。

附言

不要忘记传递给 .cancellationTokenLongRunningMethodAsync

评论

0赞 Gary 4/3/2023
好的,所以对线程的性能/可伸缩性/阻塞没有实际影响。这更多地与确保 ASP.NET 试图优雅地关闭它们有关?
0赞 Guru Stron 4/3/2023
@Gary基于对 - 是的。BackgroundWorkScheduler
1赞 Stephen Cleary 4/3/2023 #2

以下两种调用执行异步操作(如 API 调用)的方法的方法有什么区别吗?

正如我在博客上解释的那样,在这种情况下没有区别。它们都调用异步重载,并且都异步运行。

从更广泛的角度来看,我一般不鼓励,因为不能保证会完成。如果你想要一个可靠的解决方案,你需要使用一个带有后台工作线程的持久队列,我的博客上也对此进行了解释。QueueBackgroundWorkItemLongRunningMethodAsync

评论

1赞 Gary 4/4/2023
谢谢你的明确回答,斯蒂芬。我从您关于该主题的详细文章中了解 QueueBackgroundWorkItem 的风险。只是想弄清楚 .NET 实际上如何处理这两条路由。