2009-05-18 1 views
0

私は、ユーザーが長時間実行するプロセスを要求している状況があります。私はコードビハインドの別のスレッドでそれを開始し、ユーザー "処理"にメッセージを返す予定です。それから数秒ごとにスレッドの状態を(非同期呼び出しによって)ポーリングします。スレッドが終了すると、成功メッセージが表示されます。ASP.NETは長時間実行されているスレッドでスレッドステータスをチェックしますか?

質問:元のリクエストが完了したら、スレッドをどのようにポーリングしますか?

私の知る限り、Pageオブジェクトは別のスレッドからスピンオフします。要求が完了すると、Pageオブジェクトはもはや存在しませんが、そのスレッドはどうですか?作成したスレッドのステータスを取得するにはどうすればよいですか?

答えて

3

よく、あなたはいくつか要求を識別する方法が必要です。これを複数のマシンに拡張できるようにしたい場合は、要求IDと現在のステータスをデータベース(または同様の場所からアクセスできる何らかのストレージ)に格納することを検討する必要があります。

もしあなたがその状況を気にしないのであれば、AppDomainのリサイクルについて心配する必要はありません。要求IDからステータスへのシングルトン辞書を持つことができます。クライアントは離れてしまい、ステータスをチェックしません。

(もちろん、それは真のシングルトンである必要はありません - それは依存性注入で提供される共有リソースかもしれませんが、ポイントは共有する必要がありますどういうわけか新しいものからそれを得ることができる

また、複数のサーバーのWebサイトに関する警告とAppDomainリサイクルのセッションバックオブジェクトを使用することもできます。

+0

私は元のリクエストに(リクエストID、ステータス)を格納するシングルトンクラスを作成します。スレッドはそのシングルトンクラスを使用してステータスを更新します。それ以降のリクエストでは、そのシングルトンクラスを介してステータスをチェックできます。あれは正しいですか? –

+1

シングルトンは「現在の要求、ステータス」のコレクションを保存します。しかし、あなたはセッションオブジェクトを見て、それについて考えるのが良いかもしれません。フレームワーク内のセッションコンテナをシングルトンとして扱うだけで、まったく同じ原理です。あなたは自分のコンテナを使って、より明確に何が起こっているのかを見ることができます。 –

+0

までクリーンアップ、私は "現在の要求、ステータス"のペアをユーザーから要求したとき、ステータスが "完了"のときにセッションから削除できます。しかし、私はまだユーザーが状況を要求しない状況を処理する方法を必要とします(ページを閉じたり閉じる)。そのクリーンアップを行うための標準的な方法はありますか? –

0

私はジョンの答えには同意しません。要求を識別する方法は必要ありません。要求が作成したスレッドを一意に識別する方法が必要です。スレッドをポーリングするajaxリクエストによって、スレッドの実行が終了したかどうかを確認できます。元のリクエストがすべて関連している理由がわかりません...

関連する問題