ご意見ありがとうございます。他の人が解決策としてそれを考えることができるように、私がこれについて行った方法:
キューイングはおそらく最も「正しい」手段ですが、私がやろうとしていることを実際に上回っている追加の実装が必要になります。http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspxからの情報を使用する
まず、処理クラスを作成し、それをバックグラウンドスレッドでスピンアップして、クライアントからXMLを取得した後に作業を行います。これにより、ワーカースレッドがバックグラウンドで継続している間に接続が解放されます。
処理クラスをとして登録しましたIRegisteredObject
。Stop(bool immediate)
私はメソッドを実装しました
public void Stop(bool immediate)
{
if (!immediate && _working)
return;//don't unregister yet, give it some time
if(immediate && _working)
{
//TODO: Log this instance
}
HostingEnvironment.UnregisterObject(this);
}
作業を処理しているときに_working変数をtrueに設定し、完了したら設定を解除します。まれに、作業を処理していて、AppDomainが停止しているために停止が呼び出された場合、最初は登録を解除せずに戻ります。これにより、プロセスが完了するまでにもう少し時間がかかります。即時フラグがtrueに設定された状態でメソッドが2回呼び出された場合、問題はすぐにログに記録され、登録が解除されます。
これは最終的な解決策ではないかもしれませんが、私の目的では、非常にまれな状態が発生したときにアラートを出し、データを処理するときにクライアントの接続を保持しないようにします。