gpt4 book ai didi

c# - MVC4 + async/await + 在 Action 完成前返回响应

转载 作者:可可西里 更新时间:2023-11-01 03:09:50 24 4
gpt4 key购买 nike

在我的 MVC4 应用程序中,我需要添加一个 Controller 来上传和处理大文件。文件上传后,我需要立即开始对该文件的异步处理,并在不等待处理完成的情况下将响应返回给浏览器。

显然我可以启动一个新线程来手动处理文件,但我想知道我是否可以使用 .net 4.5 引入的异步/等待机制来实现这种情况

为了测试这个概念,我尝试了这样的事情:

public async Task<ActionResult> Test()
{
TestAsync();
return View("Test");
}

public async void TestAsync()
{
await LongRunning();
}

private Task<int> LongRunning()
{
return Task<int>.Factory.StartNew(() => Pause());
}

private int Pause()
{
Thread.Sleep(10000);
return 3;
}

异步机制似乎总体上有效:当我调试代码时,我点击了“return View("Test");” “return 3”行之前的行。但是,浏览器仅在 Pause 方法完成后才会收到响应。

这看起来像常规异步 Controller (具有 Async 和 Completed 方法的 Controller )。有没有办法在我的场景的 Controller 中使用 async/await?

最佳答案

Obviously I could start a new thread for processing the file manually, but I'm wondering if I can implement this scenario using async/await mechanism introduced with .net 4.5

不,你不能,因为async doesn't change the HTTP protocol .

Svick 和 James 已经将正确答案作为评论发布,为方便起见,我将其复制如下:

IIS can recycle your application pretty much at any time.

If you have long-running things to do async to the request, do them elsewhere. The 'typical' is a persistent queue (MSMQ, Azure, RabbitMQ, etc) with something else (windows service, exe run by task scheduler, app using Quartz.net, etc) processing them.

总而言之,HTTP 为您提供一个请求和一个响应(async - 以及其他任何内容 - 都不会改变这一点)。

ASP.NET 是围绕 HTTP 请求设计的(并做出类似“如果没有未完成的请求,则停止该网站是安全的”这样的假设)。您可以启动一个新线程并将上传的内容保存在内存中(这是最简单的方法),但强烈不建议这样做。

对于您的情况,我建议您遵循 James 的建议:

  • 上传完成后,将上传内容保存到持久性存储(例如 Azure 队列),并向浏览器返回“票证”。
  • 让其他进程(例如 Azure worker 角色)处理队列,最终将其标记为完成。
  • 让浏览器用它的“票”轮询服务器。服务器使用“票”在持久存储中查找文件并返回它是否完整。

这有一些变化(例如,在处理完成时使用 SignalR 通知浏览器),但总体架构是相同的。

这很复杂,但这是正确的方法。

关于c# - MVC4 + async/await + 在 Action 完成前返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12319642/

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