Self-Hosted OWIN環境内のApiControllerで長時間実行されるタスク(たとえば4-5分)を実行したいとします。しかし、私はそれを完了するのを待つことなく、(長い実行タスクを開始するとすぐに)そのタスクを開始した後に応答を送り返したいと思います。この長時間実行されるタスクは、HTTPとは何の関係もなく、非常に長くかかる可能性があるいくつかのメソッドを順番に実行します。ApiControllerで長時間実行されるタスク(WebAPI、自己ホスト型OWINを使用)
私は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>
はまた、私はSOにthis質問を発見し、正直に言うと、それはそれを達成するための唯一の方法として、私には少し混乱しそうですIRegisteredObject
ですか?
私はちょうど自己実行型アプリケーションで長時間実行されるタスクを実行しようとしています。ほとんどすべてのリソース、私が見つけた質問はasp .netに基づいており、どこから始めるべきかはわかりません。
(データベース内の)タスクをキューに入れ、サービスで処理するオプションはありませんか? –
Hangfire(https://www.hangfire.io/)は私が知る限り、これと似たようなことをしています。しかし、私はこれが質問とは少し違うと信じています。 – Deniz