2012-03-19 26 views
17

このエラーは、DownloadStringCompletedイベントでどのように取得できますか?それは終わったのですか?私はこれを発射することができる別のイベントがありますか?WebClientは同時I/O操作をサポートしていません

このエラーは非常にまれですが、しばらくして私のWP7電話機で発生します。私は何度も繰り返し発砲するWebクライアントを持っており、完了したイベントからもう一度起動します。まだいくつかの古い接続が開いているので、これは起こっていますか?この100%を防ぐ方法はありますか?

スレッドが自分自身を歩く可能性があるかどうかを確認しましたが、完了したイベント内でのみ発生します。

完全なイベントが発生すると、クライアントはもはやisBusyではないことをどのように確認できますか? 1つの提案は、クライアントがビジー状態の間にスレッドスリープをしばらく追加することでした。

いくつかの擬似コード。

var client = new WebClient("URL 1"); 
client.CompletedEvent += CompletedEvent; 
client.downloadasync(); 

void CompletedEvent(){ 
Dosomestuff; 
client.downloadasync(); //This is where we break. 
} 

答えて

8

唯一の答えは、完了したイベントの範囲内で新しいWebクライアントを作成することです。 webclientは読み取り専用なので、これを新規に設定することはできません。新しいクライアントを作成することは唯一の解決策です。これにより、古いクライアントはバックグラウンドで完了することができます。古いインスタンスを再利用するのではなく、新しいインスタンスを作成しているので、メモリにはわずかな影響があります。しかし、スコープが正しく設定されていれば、ガベージコレクタはそれをきれいに保つ必要があります。

15

WebClientは1回の操作しかサポートしていないため、複数のファイルをダウンロードすることはできません。コードは表示されていませんが、古いものが完成する前に何らかの形で新しいリクエストを発していると思います。別のフェッチを実行しようとするとWebClient.IsBusyが真であるということです。

は次のスレッドを参照してください:

wb.DownloadFileAsync throw "WebClient does not support concurrent I/O operations." exception

+0

完成したイベントでない限り、私のポイントは決してdownloadasyncを呼び出しません。私がそのイベントに参加していれば、接続を閉じてクライアントを解放してはいけませんか?これが当てはまらない場合は、IsBusyを使用する以外にどのように回避できますか? – firebellys

+0

はい、このスレッドは、私が今やっていることを正確に行うように指示しています。エラーが発生しています。上記の情報を追加します。 – firebellys

+1

ちょうど誰かを救うために、上に掲示されたその答えはここへのちょうどリンク:http://stackoverflow.com/questions/2042258/webclient-downloadfileasync-download-files-one-at-a-time – TEK

0

解決策は、擬似コードの例を変更するために、複数のWebClientオブジェクトを使用することです。 try

var client = new WebClient("URL 1"); 
client.CompletedEvent += CompletedEvent; 
client.downloadasync(); 

void CompletedEvent(){ 
Dosomestuff; 
var client2 = new WebClient(); 
client2.downloadasync(); 
} 
1

WebClientを使用する代わりに、HttpClientを使用して並列HTTP呼び出しを実行します。以下のコードは、ファイルをダウンロードする方法を示しています。

 HttpClient httpClient = new HttpClient(); 
     var documentList=_documentManager.GetAllDocuments(); 
     documentList.AsParallel().ForAll(doc => 
     { 

      var responseResult= httpClient.GetAsync(doc.FileURLPath); 
      using (var memStream = responseResult.Result.Content.ReadAsStreamAsync().Result) 
      { 
       using (var fileStream =File.Create($"{filePath}\\{doc.FileName}")) 
       { 
        memStream.CopyTo(fileStream); 
       } 

      } 
     }); 
+0

これは実際にこの問題に対処する唯一のポストです。キックお尻のおかげで男。 +1 –

関連する問題