如何在ASP.NET Web API中执行异步“即发即忘”操作
所以,我有这个Web API动作,它执行一个异步函数。
public void Post([FromBody]InsertRequest request) { InsertPostCommand.Execute(request); DoAsync(); } private async void DoAsync() { await Task.Run(() => { //do async stuff here }); }
我实际上希望控制器操作在执行异步操作时返回到客户端。
我这样做了,因此我得到一个例外:
System.InvalidOperationException: An asynchronous module or handler completed while an asynchronous operation was still pending.
我怎么能实现这个呢?
谢谢
你要求做的是非常危险的 。 我有一篇博客文章解释了为什么这是一个坏主意,包括一个BackgroundTaskManager
类型的代码,可以最大限度地减少出现错误的可能性 。 不幸的是,即使您使用ASP.NET运行时注册后台工作,依赖此行为仍然是一个坏主意。
正确的解决方案是让您的WebAPI请求将请求放入可靠的队列(例如Azure Queue),并拥有一个排队的独立服务(例如Azure Worker Role)进程。