使用Async控制器操作来调用现有的同步方法

时间:2014-04-04 11:06:29

标签: c# asp.net asp.net-mvc-4 asynchronous async-await

除了一些网络服务之外,我没有太多处理异步/线程/任务。

我正在使用MVC4。我有现有的代码,需要一些时间来运行。它使用服务层中的现有方法,该方法使用其他层中的其他区域。

基本上我希望能够从Asynccontroller到该方法进行ASync调用。然而,似乎我需要更改/创建另一种方法来实现所有任务&等待关键词,这是一个非常重要的工作,一直在改变链条。

是否可以这种方式调用/'触发'同步方法?

即使用户关闭浏览器,我也希望漫长的过程(在后台创建一些文档)继续运行。但是,如果用户仍然打开浏览器,那么我想向他们返回通知。

是否有更好的方法可以从MVC应用程序触发后台任务执行?

1 个答案:

答案 0 :(得分:4)

我认为您正在尝试将async用于无法做到的事情。正如我在博客中描述的那样async does not change the HTTP protocol

  

是否可以这种方式调用/'触发'同步方法?

排序。如果您要从桌面/移动应用程序中移出UI线程,则可以使用Task.Run BackgroundTaskManager。但是在ASP.NET MVC应用程序中这样做是没有意义的。

  

即使用户关闭浏览器,我也希望漫长的过程(在后台创建一些文档)继续运行。但是,如果用户仍然打开浏览器,那么我想向他们返回通知。

问题在于你是returning early from an ASP.NET request, and (as I describe on my blog), that's quite dangerous

一个合适的解决方案是将工作排入可靠队列(例如,Azure队列或MSMQ),有一个独立的后端进行处理(例如,Azure工作者角色/ Web作业或Win32服务),并使用像SignalR这样的东西通知。

只要您尝试在没有请求上下文的ASP.NET进程中工作,就会遇到您的进程可能在不完成工作的情况下退出的危险。如果您对此感到满意,那么您可以使用我上面博客中的{{1}}类型来最大限度地减少发生这种情况的可能性(但请记住:它仍然可以)。