2012-04-24 10 views
6

これはASP.NET ASMX Web Service/.NET Framework 4.0です。"Fire and Forget"タスク用のWebサービスのThreadPool.QueueUserWorkItem

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

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

答えて

6

問題は、すべての今、そして、その後、ASP.NETは、アプリケーションプールをリサイクルすることです。あなたのバックグラウンドタスクを知らないので、それは考慮されずAppDomainが破棄されると中止されます。

ほとんどの場合、作業は完了しますが、十分長い間実行すると、このシナリオが発生します。

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

1)「正しい」方法は、ASP.NET外で実行するWindowsサービスを作成することです。 WCF経由でサービスに指示を送信できます。

2)「迅速かつ汚れた」方法は、ASP.NETサイトにユーザーが呼び出していない非表示のWebサービスを作成することです。あなたのアプリケーションは非表示のサービスへの非同期要求を開始し、待たずに独自の結果をユーザに返します。

ASP.NETは、隠されたサービスへのリクエストがあなたのアプリ内からのものであることを知りません。単に別のリクエストとして扱います。 ASP.NETはこの要求を知っているため、リサイクル時には中止しません。

+0

こんにちはNicholas、どのようにasp.net内の隠されたWebサービスは、アプリケーションプールがリサイクルされないことを確認? – Abhijeet

+0

私は "迅速かつ汚れた"に興味があります - ユーザーが開始したwebserviceメソッドによって呼び出される新しい非同期関数を作成するだけですか? –

関連する問題