在sync方法中运行异步进程,而不等待该进程完成,但在请求完成之前保持活动状态

本文关键字:进程 请求 活动状态 等待 方法 sync 运行 异步 | 更新日期: 2023-09-27 17:59:21

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

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

我需要这个过程来不阻止发出web请求的用户查看请求的内容(即,我不想await),但问题是,一旦HTTP request结束,这个过程就被中止了。

那么,我如何在同步方法中启动async进程,而不阻止HTTP request执行它的任务,并且在HTTP request结束时不杀死这个进程呢?

在sync方法中运行异步进程,而不等待该进程完成,但在请求完成之前保持活动状态

我需要这个过程来不阻止用户进行网络请求,以查看请求的内容

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

那么,如何在同步方法中启动异步进程,而不阻止HTTP请求执行其任务,并且在HTTP请求结束时不杀死该进程呢?

这与asyncawait无关。正如我在博客中所描述的,async不会更改HTTP协议。

你所要求的是"点燃并忘记"。请注意,这在ASP.NET上非常危险,因为IIS/ASP.NET不是为在请求上下文的之外执行而设计的。如果您可以将工作作为请求的一部分,并让客户端执行即发即弃,那就更好了。

但如果你真的想……我在我关于ASP.NET上的即发即弃的博客文章中描述了各种方法。总之,在ASP.NET上执行即发即弃最可靠的方法是让请求处理程序将工作放入可靠的队列中,并让独立进程从该队列中读取并执行实际工作。然而,如果你不需要可靠性(即,你可以偶尔失去工作),那么你可以使用HostingEnvironment.QueueBackgroundWorkItem,比如:

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