2011-03-11 10 views
1

HttpWebRequest.BeginGetRequest()を使用して、1つのメソッドから500の非同期HTTP要求を作成しています。私は、そのメソッドがすべてのリクエストから応答を得るか、タイムアウトするまで待つことを望みます。非同期要求が完了するまで.NET 4スレッドが待機するようにするにはどうすればよいですか?

これを行うにはどのような方法が最適ですか?

Tasks.WaitAll()を使用するためにTaskオブジェクトのList内で非同期呼び出しをラップしていますが、これが良い解決策であることを知る前にウサギの穴をあまりに遠くに行きたくないです。

アイデア?

EDIT

私はカウンターを実装し、彼らは動作しますが、私はこのページに表示されるように、デリゲートを使用する方法について興味があります。

Multi-threading and Async Examples

誰もが前にこのような何かをやっていますか?それは過労ですか?

答えて

1

個人的に私はスレッドをブロックしません。非同期モデルの目的を破ります。

これらのWebリクエストが完了するまで待つ必要があった場合は、成功または失敗したリクエストでコールバックされるたびに増分されるカウンタを保持しておきます。

はあなたにもいいと応答性のあなたのUIを維持し、おそらくカウンタ/プログレスバーを更新することができるこの方法を各コールバックにカウンターを確認し、ご希望の数をヒットした場合、スレッドは続けてみましょう...

- これらをUIスレッドで蹴っていないとしても、何が起こっているのかについてユーザーに視覚的なフィードバックを与えるのは良いことです。

私は現在のタスクのリスト内の非同期呼び出しをラップしてる
+0

フィードバックありがとうございます。私は本当に簡単にカウンターを実装できると思う。これは一回限りの解決策であるため、UIの応答性については心配していません。基本的には、呼び出されると、一連のホストに照会し、応答を解析し、その応答をデータベースに格納するWebサービスです。 – GregB

+0

これは、非同期タスクを管理する呼び出しスレッドがUIスレッドでなければならないことを前提としています。おそらく、UIスレッドに他のすべてを管理する単一の非同期タスクを生成させ、UIロジックに負担をかけるのではなく進捗を報告する方がよいでしょう。 –

+0

@Tylerはこう述べています。「個人的に私はスレッドをブロックしません。非同期モデルの目的を破ります。 コンソールアプリケーションなどで、すべてのスレッドが完了するまで待つ必要が生じることがあります。コンソールアプリケーションがすぐに終了すると、それらのスレッドはすべて完了せずにただちに終了します。 –

2

はTasks.WaitAllを(使用するオブジェクト)

あなたが本当ににこれらの「タスク」を強制したい場合、これはかなりきれいなソリューションです。この時点で同期してブロックしてください。これはTask.WaitAll()の主な根拠であり、タイムアウト後にブロック操作をキャンセルすることができます(オプション)。

関連する問題