MVC4+async/await+returnresponsebeforeoperationcomplete在我的MVC4应用程序中,我需要添加一个控制器来上传和处理大文件。文件一上传,我就需要开始对该文件的异步处理,并在不等待处理完成的情况下将响应返回给浏览器。显然我可以手动启动一个新线程来处理文件,但我想知道我是否可以使用.net4.5引入的异步/等待机制来实现这个场景为了测试这个概念,我尝试了这样的事情:publicasyncTaskTest(){TestAsync();返回视图(“测试”);}publicasyncvoidTestAsync(){awaitLongRunning();}privateTaskLongRunning(){returnTask.Factory.StartNew(()=>Pause());}privateintPause(){Thread.Sleep(10000);返回3;异步机制似乎在一般情况下工作:当我调试代码时,我点击了“returnview("test");”"return3"行之前的行。但是,浏览器只会在Pause方法完成后才会收到响应。这看起来像一个普通的异步控制器(一个具有Async和Completed方法的控制器)。有没有办法在控制器中为我的场景使用异步/等待?显然我可以手动启动一个新线程来处理文件,但我想知道我是否可以在这种情况下使用.net4.5引入的异步/等待机制不可以,因为异步不会更改HTTP协议。Svick和James已经将正确答案作为评论发布,为方便起见,我在下面重复:IIS可以随时回收您的应用程序。如果您有需要异步的长时间运行的东西,请在其他地方进行。“典型”是持久队列(MSMQ、Azure、RabbitMQ等)和其他东西(Windows服务、任务调度程序运行的exe、使用Quartz.net的应用程序等)处理它们。总而言之,HTTP为您提供请求和响应(异步-以及其他任何-都不会改变这一点)。ASP.NET是围绕HTTP请求设计的(并假定“如果没有未完成的请求,则可以安全地停止该网站”)。您可以启动一个新线程并将上传的内容保存在内存中(这是最简单的方法),但强烈建议不要这样做。对于您的情况,我建议您遵循James的建议:这有一些变化(例如,在处理完成时使用SignalR通知浏览器),但总体架构是相同的。这很复杂,但这是正确的方法。您的代码中有错误。您必须在操作中等待对TestAsync的调用。如果你不这样做,它只是返回一个“任务”对象而不运行任何东西。publicasyncTaskTest(){awaitTestAsync();返回视图(“测试”);在异步方法中休眠的正确方法是调用awaitTask.Delay(10000);您必须更改TestAsync的签名:如果返回void,则该方法不应标记为异步。它必须返回任务。继续返回void以与.net事件兼容。publicasyncTaskTestAsync(){awaitLongRunning();}方法体是一样的。您的LongRunning方法同步休眠10秒。改变它,让睡眠发生在任务中。以上就是C#学习教程:操作完成前MVC4+async/await+返回响应分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
