gpt4 book ai didi

asp.net - ASP.NET WebApi 中的后台异步/等待

转载 作者:行者123 更新时间:2023-12-03 01:55:22 25 4
gpt4 key购买 nike

假设我有以下异步方法,需要相当长的时间才能完成其工作:

void async Task LongWork()
{
await LONGWORK() // ... long work
}

现在,在 Web api 中,我想在后台运行该工作(即,我想在启动 LongWork() 之后但完成之前返回 Http 请求:

我可以想到三种方法来实现这一目标:

1) public async Task<string> WebApi()
{
... // do another work

await Task.Factory.StartNew(() => LongWork());

return "ok";
}
2) public async Task<string> WebApi()
{
... // do another work

await Task.Factory.StartNew(async () => await LongWork());

return "ok";
}

3) public async Task<string> WebApi()
{
... // do another work

Task.Factory.StartNew(async () => await LongWork());

return "ok";
}

问题 1:方法 #1 和方法 #2 有什么区别?

问题2:在 ASP.NET 世界中,运行一个方法(在本例中,LongWork() 在后台线程中包含一些异步/等待对)的正确方法是什么?特别是,在#3 中,Task.Factory.StartNew(async () => wait LongWork()) 之前没有“await”。还好吗?

谢谢!

最佳答案

Q1: What's the difference between approach #1 and #2?

#1 的开销较小。这是唯一的区别。

Q2: What is the right way to, in the ASP.NET world, run a method (in this example, LongWork() containing some async/await pairs in a background thread?

没有您提供的选项。一方面,它们都是use Task.Factory.StartNew without specifying a TaskScheduler , which is dangerous (正如我在博客上所描述的)。他们应该使用Task.Run反而。但是,即使您使用 Task.Run ,你会遇到更严重的潜在问题。

根本问题是:HTTP 协议(protocol)以每个请求恰好有一个匹配的响应为中心。当 HTTP 服务器(例如 ASP.NET)知道没有未完成的请求时,它会做出诸如“回收工作进程是安全的”之类的假设。

I describe this problem in more detail on my blog 。该博文中还有一个类型 BackgroundTaskManager向 ASP.NET 运行时注册后台任务并(正确)通过 Task.Run 执行它们。 您应该只使用BackgroundTaskManager如果您阅读了博客文章并理解并接受这仍然是危险和不安全的。

一个更好(读:更可靠)的解决方案是首先将要完成的工作的表示写入持久存储(例如,Azure 队列),并拥有独立的后端进程(例如,Azure 辅助角色)处理来自队列的请求。

关于asp.net - ASP.NET WebApi 中的后台异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19148003/

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