fil*_*lip 16 c# asynchronous async-await asp.net-mvc-4 .net-4.5
在我的MVC4应用程序中,我需要添加一个控制器来上传和处理大文件.文件上传后,我需要立即启动该文件的异步处理并将响应返回给浏览器,而无需等待处理完成.
显然我可以手动启动一个新线程来处理文件,但我想知道是否可以使用.net 4.5引入的async/await机制来实现这个场景
为了测试这个概念,我尝试过这样的事情:
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;
}
异步机制似乎一般工作:当我调试代码时,我点击"返回视图("测试");" 行"返回3"之前的行.但是,浏览器仅在Pause方法完成后才会收到响应.
这看起来像常规异步控制器(具有Async和Completed方法的控制器).有没有办法在控制器中为我的场景使用async/await?
Ste*_*ary 14
显然我可以手动启动一个新线程来处理文件,但我想知道是否可以使用.net 4.5引入的async/await机制来实现这个场景
不,你不能,因为async不改变HTTP协议.
Svick和James已经发布了正确的答案作为评论,为方便起见,我在下面重复:
IIS可以随时回收您的应用程序.
如果您有长时间运行的事情要求异步,请在其他地方执行."典型"是一个持久性队列(MSMQ,Azure,RabbitMQ等),其他东西(Windows服务,由任务调度程序运行的exe,使用Quartz.net的应用程序等)处理它们.
总而言之,HTTP给你一个请求和一个响应(async- 和其他任何 - 不会改变这个).
ASP.NET是围绕HTTP请求设计的(并假设"如果没有未完成的请求,则可以安全地停止此网站").你可以启动一个新的线程,并将你的上传保存在内存中(这是最简单的方法),但强烈建议不要这样做.
根据您的情况,我建议您遵循James的建议:
这有一些变化(例如,使用SignalR在处理完成时通知浏览器),但一般架构是相同的.
这很复杂,但这是正确的方法.
| 归档时间: | 
 | 
| 查看次数: | 7425 次 | 
| 最近记录: |