除了一些网络服务之外,我没有太多处理异步/线程/任务。
我正在使用MVC4。我有现有的代码,需要一些时间来运行。它使用服务层中的现有方法,该方法使用其他层中的其他区域。
基本上我希望能够从Asynccontroller到该方法进行ASync调用。然而,似乎我需要更改/创建另一种方法来实现所有任务&等待关键词,这是一个非常重要的工作,一直在改变链条。
是否可以这种方式调用/'触发'同步方法?
即使用户关闭浏览器,我也希望漫长的过程(在后台创建一些文档)继续运行。但是,如果用户仍然打开浏览器,那么我想向他们返回通知。
是否有更好的方法可以从MVC应用程序触发后台任务执行?
答案 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}}类型来最大限度地减少发生这种情况的可能性(但请记住:它仍然可以)。