2010-11-28 11 views
2

ダウンロードが進行中のUIで表示中にファイルをダウンロードしたい。Thread.Start(WebRequest.GetResponse)とWebRequest.BeginGetResponse

  1. 使用WebRequest.BeginGetResponseおよび関連する方法:WebRequestで、私は2つのオプションがあります。

    利点:正確な進捗状況をバイトで表示することができます。

    短所:より多くのコードを記述する。同期メソッドと非同期メソッドが混在しないので、BeginGetResponse,BeginRead,BeginGetRequestStreamを使用する必要があります。読み取りバッファ、タイムアウトなど、手動で実装することが多くあります。

  2. 新しいスレッドを開始(またはスレッドプールを使用)するには、WebRequest.GetResponseと関連するメソッドを使用してください。

    利点:不要なコードはありません。

    短所:正確な進捗状況を示すことはできません。

ダウンロードするファイルが小さいので、進行状況をバイト単位で表示するのが有利ですが、重要ではありません。私は2番目のアプローチを、機能的にもパフォーマンス的にも使用すると、何かが恋しくなるのですか?

多分、私が見逃した上位レベルの広く使われているラッパーがありますか? (WebClientWebRequestのプロパティを公開していないので、私はクッキーなどを使用する必要があるため私にとっては使用できません)

+0

正確な進捗状況を表示できないのはなぜですか? –

+0

@HPT 'GetResponse'はリクエストが完全に実行されたときにのみ返ると思います。したがって、それを呼び出す前に0%、後に100%、何も間にありません。私が間違っている? – Athari

+0

はい、私のせいです、ごめんなさい –

答えて

4

リクエストを実行している間にスレッドがブロックする新しいスレッドを作成すると一度に1つのリクエストをするだけで大​​したことはないが、たくさんのリクエストをすると余計なスレッドが発生する可能性があります。各スレッドは1MBのRAMを必要とします。

WebRequest.BeginGetResponseのような非同期呼び出しは、要求の処理中にスレッドをブロックしません。結果を配信するために要求が完了すると、スレッドプールからスレッドを選択します。

+1

'WebRequest'はダウンロード中にスレッドを使用しませんか?私はそれがダウンロードを開始するときにスレッドプールからスレッドを選択すると思った。スレッドを使用して結果を出すだけのポイントは何ですか? – Athari

+1

@Athari、Async I/Oは[I/O完了ポート](http://msdn.microsoft.com/en-us/library/aa365198.aspx)を使用しています。これは、ハードウェア/ネットワークカードに至るまで「非同期」であり、実際の作業がある場合にのみスレッドプールからスレッドを「借り」ます。 –