6

これは、ASP.NETASMXWebサービス/.NETFramework4.0です。

Webサービスでは、「Fire and Forget」などの別のスレッドで1つのメソッドを実行して、WebサービスがWebサイトにすぐに応答して何らかの値を返すようにします。別のスレッドでのそのメソッドは、WebサービスがWebサイトにすぐに応答を返した後10分かかる場合があります。また、そのメソッドの戻り値は必要ありません。

ThreadPool.QueueUserWorkItemを使用してこのシナリオをテストしましたが、WebサービスがWebサイトに応答を返した後でも、ThreadPoolの使用を開始したスレッドは引き続き実行されるようです。私はここで正しいですか?また、これを達成するためのより良い方法はありますか?

4

1 に答える 1

6

問題は、ASP.NET がときどきアプリ プールをリサイクルすることです。バックグラウンド タスクを認識しないため、AppDomain が破棄されると考慮されず、中止されます。

ほとんどの場合、作業は完了しますが、長時間実行すると、このシナリオに遭遇します。

次の 2 つの解決策があります。

1) 「適切な」方法は、ASP.NET の外部で実行される Windows サービスを作成することです。WCF 経由でサービスに命令を送信できます。

2) 「手っ取り早い」方法は、ASP.NET サイトに、ユーザーから呼び出されない非表示の Web サービスを作成することです。アプリは非表示のサービスへの非同期リクエストを開始し、待機せずに独自の結果をユーザーに返します。

ASP.NET は、非表示のサービスへの要求がアプリ内からのものであることを認識しません。別の要求として処理するだけです。ASP.NET はこの要求を認識しているため、リサイクル時に中断しません。

于 2012-04-24T14:48:10.957 に答える