これを行うAPIがたくさんあることは知っていますが、ホスティング環境(ASP.NET)では、別のスレッドで確実に実行できることを制限していることも知っています。
私は完全に間違っている可能性があるので、私がそうである場合は私を訂正してください、しかしこれは私が知っていると思うことです。
- 通常、要求は120秒後にタイムアウトします(これは構成可能です)が、最終的にASP.NETランタイムは、完了するのに時間がかかりすぎる要求を強制終了します。
- ホスティング環境(通常はIIS)はプロセスのリサイクルを採用しており、いつでもアプリのリサイクルを決定できます。これが発生すると、すべてのスレッドが中止され、アプリが再起動します。しかし、それがどれほど積極的かはわかりません。通常の進行中のHTTPリクエストを中止すると考えるのはちょっとばかげていますが、スレッドの作業単位について何も知らないため、スレッドを中止することを期待します。スレッド。
簡単かつ確実に理論的に長時間実行するタスクを実行するプログラミングモデルを作成する必要がある場合、それは数日間実行する必要がありますが、ASP.NETアプリケーション内からこれをどのように実現しますか?
この問題についての私の考えは次のとおりです。
私は、win32サービスでWCFサービスをホストするという長い道のりを考えてきました。そして、WCFを介してサービスに話しかけます。ただし、これを選択する唯一の理由は、いくつかの異なるWebアプリからタスク(作業単位)を送信することであるため、これはあまり実用的ではありません。その後、最終的にサービスにステータスの更新を依頼し、それに応じて行動します。これに関する私の最大の懸念は、サービスがいくつかの命令を実行できるようにするためにすべてのタスクをサービスにデプロイする必要がある場合、それは特に素晴らしい経験ではないということです。この入力の問題もあります。大きなデータセットがあり、それをかみ砕く必要がある場合、このサービスにデータをどのように提供しますか?
私が今よくしているのはこれです
SELECT TOP 10 *
FROM WorkItem WITH (ROWLOCK, UPDLOCK, READPAST)
WHERE WorkCompleted IS NULL
これにより、SQL Serverデータベースを作業キューとして使用し、このクエリを使用してデータベースを定期的にポーリングして作業を行うことができます。作業項目が正常に完了した場合、それを完了としてマークし、それ以上何もすることがなくなるまで続行します。私が嫌いなのは、理論的にはいつでも中断される可能性があり、成功と完了のマークの中間にある場合、同じ作業項目を2回処理してしまう可能性があることです。私は少し妄想的かもしれませんし、これはすべて問題ないかもしれませんが、私が理解しているように、それが起こらないという保証はありません...
私は以前にSOについて同様の質問があったことを知っていますが、決定的な答えで実際には答えません。これは非常に一般的なことですが、ASP.NETホスティング環境は長時間実行される作業を処理するための設備が整っていません。
あなたの考えを共有してください。