gpt4 book ai didi

c# - Api Controller 中长时间运行的任务(使用 Web API,自托管 OWIN)

转载 作者:太空狗 更新时间:2023-10-29 22:21:35 26 4
gpt4 key购买 nike

我想在自托管 OWIN 环境中的 ApiController 中运行长时间运行的任务(比如 4-5 分钟)。但是,我想在开始该任务后(一旦我开始长时间运行的任务)发回响应,而不是等待它完成。这个长时间运行的任务与 HTTP 无关,并且顺序运行一些可能需要很长时间的方法。

我看看this博客文章并决定尝试 QueueBackgroundWorkItem。但是,我不确定是否可以在自托管(控制台应用程序)owin 环境中使用此方法或是否有必要使用它。在我认为的自托管控制台应用程序中,应用程序本身管理请求并且所有请求都在同一个 AppDomain 中运行(应用程序默认 AppDomain,我们不创建任何新的 appDomain),所以我可以只运行一个长时间运行的任务一劳永逸的时尚,没有做任何特别的事情?

无论如何,当我使用QueueBackgroundWorkItem时,我总是得到错误:

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Operation is not valid due to the current state of the object.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
at System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem(Func`2 workItem) at BenchMarkService.SmokeTestController.IsItWorking() in C:\Devel\Code\Projects\BenchMarkService\BenchMarkService\SmokeTestController.cs:line 18 at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
</StackTrace>
</Error>

我还找到了this关于 SO 的问题,老实说,这对我来说似乎有点困惑,因为实现这一目标的唯一方法是 IRegisteredObject 还是不是?

我只是想在自托管应用程序中运行一个长时间运行的任务,我很感激任何关于此的想法。我找到的几乎所有资源和问题都是基于 asp .net 的,我不确定从哪里开始。

最佳答案

自托管 OWIN 应用程序通常是常规控制台应用程序,因此您可以像在控制台应用程序中那样执行一些长时间运行的任务,例如:

  • Task.Run
  • ThreadPool.QueueUserWorkItem
  • 新线程(...).Start()

在 IIS 托管的 ASP.NET 应用程序中,不建议使用此类方法,因为应用程序池通常会被回收,因此您的应用程序会经常关闭并重新启动。在这种情况下,您的后台任务将被中止。为了防止(或推迟)这种情况,引入了 QueueBackgroundWorkItem 等 API。

但是因为您是自托管的并且不在 IIS 中运行,所以您可以只使用上面列出的 API。

关于c# - Api Controller 中长时间运行的任务(使用 Web API,自托管 OWIN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38916846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com