所以我使用Global.asax
Application_BeginRequest
启动了这样的后台任务:
processor.RunAllAsync()
.ContinueWith(x => x.Exception.LogError(),
TaskContinuationOptions.OnlyOnFaulted);
我需要这个过程不阻止用户使Web请求看到所请求的内容(即,我不想await
它),但问题是现在该进程被中止一次HTTP request
结束了。
那么,如何在同步方法中启动async
进程而不阻止HTTP request
执行此操作,并且在HTTP request
结束时也不会终止此进程?
答案 0 :(得分:2)
你确定吗?大多数客户端都可以发出HTTP请求,而不是等待结果。我需要此过程不阻止用户使Web请求看到所请求的内容
那么,如何在不阻止HTTP请求执行操作的情况下启动同步方法中的异步进程,并且在HTTP请求结束时也不会终止此进程?
这与async
或await
无关。正如我在博客中描述的那样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());