在同步方法中运行异步进程而不等待该进程完成,但保持请求处于活动状态直到它完成

时间:2016-08-01 01:53:42

标签: c# asp.net-mvc asynchronous synchronization httprequest

所以我使用Global.asax Application_BeginRequest启动了这样的后台任务:

processor.RunAllAsync()
            .ContinueWith(x => x.Exception.LogError(), 
                               TaskContinuationOptions.OnlyOnFaulted);

我需要这个过程不阻止用户使Web请求看到所请求的内容(即,我不想await它),但问题是现在该进程被中止一次HTTP request结束了。

那么,如何在同步方法中启动async进程而不阻止HTTP request执行此操作,并且在HTTP request结束时也不会终止此进程?

1 个答案:

答案 0 :(得分:2)

  

我需要此过程不阻止用户使Web请求看到所请求的内容

你确定吗?大多数客户端都可以发出HTTP请求,而不是等待结果。

  

那么,如何在不阻止HTTP请求执行操作的情况下启动同步方法中的异步进程,并且在HTTP请求结束时也不会终止此进程?

这与asyncawait无关。正如我在博客中描述的那样async does not change the HTTP protocol

你所要求的是“火与忘记”。请注意,这在ASP.NET上非常危险,因为IIS / ASP.NET不是为了在请求上下文外部工作而设计的。如果您可以将工作作为请求的一部分,那就更好了,只需让客户端完成即可。

但如果你真的想...我在blog post on fire-and-forget on ASP.NET中描述了各种方法。总而言之,在ASP.NET上执行“即发即忘”的最可靠方法是让请求处理程序将工作放入可靠的队列中,并从该队列中读取独立进程并执行此操作实际工作。但是,如果您不需要可靠性(即,您偶尔会失去工作就可以了),那么您可以使用HostingEnvironment.QueueBackgroundWorkItem,因此:

HostingEnvironment.QueueBackgroundWorkItem(_ => processor.RunAllAsync());