Win*_*ker 4 c# asp.net-mvc asynchronous
我正在写一个MVC5应用程序,它有一个带有函数的控制器 Method1
我有第三方功能async Task,让我们称之为它DoMethodAsync(它本质上是一个POST调用).
我想在返回之前调用它,Method1但我并不真正关心异步任务的结果,如果失败,它就会失败.如何触发并忘记并让它在后台执行,以便它不会阻止控制器响应其他请求?
如何确保DoMethodAsync仅在Method1返回后执行?
Ste*_*ary 10
我并不关心异步任务的结果,如果失败,它就会失败.
真?只是问,因为这是一个非常罕见的用例.
如何触发并忘记并让它在后台执行,以便它不会阻止控制器响应其他请求?
我有一篇博文,介绍了在ASP.NET上"发射并忘记"任务的各种方法.
您不希望只调用该方法并忽略返回的任务,因为该方法将继承启动请求的请求上下文.然后在请求完成之后,处理请求上下文,并且该方法可以最终处于"有趣"的地方 - 有些东西会起作用,但有些东西不会.
因此,最小的可行解决方案是将其包装Task.Run:
var _ignored = Task.Run(() => DoMethodAsync());
Run Code Online (Sandbox Code Playgroud)
但请注意,ASP.NET完全没有意识到这种"额外操作".如果你想DoMethodAsync有更多的机会实际执行完成,那么你需要使用HostingEnvironment.QueueBackgroundWorkItem(4.5.2+)或我自己的BackgroundTaskManager.Run(4.5.0/4.5.1)在ASP.NET运行时注册它.
另外请注意,没有这些选项将保证DoMethodAsync将运行至完成; 他们只是给你"尽力而为".对于真正可靠的系统,您需要一个适当的分布式架构,即具有独立处理器的可靠存储.
调用异步方法意味着在异步方法执行时,调用方法(您的代码)不会被阻塞,至少默认情况下不会被阻塞(您可以通过“await”关键字或通过调用任务的阻塞之一来使代码阻塞)诸如“结果”或“等待”等方法...)。
这意味着,如果您只是调用该方法,该方法将异步运行,您的代码将不会等待它结束。我认为这正是你想要的。
| 归档时间: |
|
| 查看次数: |
8148 次 |
| 最近记录: |