4

変更された WebClientを使用して、次の特性を持つサービスから定期的にデータをダウンロードします。

  • データのダウンロード (~1GB) には約 20 分かかります
  • 場合によっては、サービスがデータをまったく返さないことを決定したり (要求がハングする)、最初のバイトを返すのに数分から数時間かかることがあります。

サービスが妥当な (構成可能な) 時間内にデータを返さない場合は、すぐに失敗したいと思いますが、進行中のダウンロードが成功するまでには十分な時間が必要です。

WebRequest.Timeoutプロパティは、リクエストが完了するまでの合計時間を制御するようですが、ReadWriteTimeout、データ転送の開始後にデータを読み取るために使用できる合計時間を制御します。

接続を確立してから最初のバイトが返されるまでの最大待機時間を制御するプロパティがありませんか? そのようなプロパティがない場合、どうすれば問題にアプローチできますか?

4

1 に答える 1

2

あなたが探している結果を達成する追加のタイムアウト プロパティを認識していません。頭に浮かぶ最初の考えは、DownloadProgressChangedデータが受信されたことを示すためにフラグを更新するハンドラーをアタッチすることです (ただし、必ずしも正確ではありません)。

Timerまたはを使用するEventWaitHandleと、短時間ブロック (または必要に応じて非同期を処理) し、データが受信されたかどうかを評価できます。以下のコードは完全に肉付けされた例ではありませんが、実装方法のアイデアです。

using (var manualResetEvent = new ManualResetEvent(false))
using (var client = new WebClient())
{
    client.DownloadProgressChanged += (sender, e) => manualResetEvent.Set();
    client.DownloadDataAsync(new Uri("https://github.com/downloads/cbaxter/Harvester/Harvester.msi"));

    if (!manualResetEvent.WaitOne(5000))
        client.CancelAsync();
}

上記の例では、が呼び出された場合にmanualResetEvent.WaitOne返されます。ゼロ以外の値のみを確認して設定することをお勧めしますが、理解できたと思いますか?trueDownloadProgressChangede.BytesReceived > 0

于 2012-06-20T14:46:47.643 に答える