List<Uri>
とWebClient
クラスを同時に使用してインターネットから画像をダウンロードするツールを作成しています。WebクライアントでUrisのリストが指定されている場合、すべてのファイルがダウンロードされない
私が使用しています新しいWebクライアント:
public class PatientWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest w = base.GetWebRequest(uri);
w.Timeout = Timeout.Infinite;
return w;
}
}
とダウンロード方法:ここでは、関連するコードです
public static void DownloadFiles()
{
string filename = string.Empty;
while (_count < _images.Count())
{
PatientWebClient client = new PatientWebClient();
client.DownloadDataCompleted += DownloadCompleted;
filename = _images[_count].Segments.Last().ToString();
if (!File.Exists(_destinationFolder + @"\" + filename))
{
try
{
client.DownloadDataAsync(_images[_count], _images[_count]);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
++_count;
}
}
private static void DownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
{
if (e.Error == null)
{
Uri uri = (Uri)e.UserState;
string saveFilename = uri.Segments.Last().ToString();
byte[] fileData = e.Result;
if (saveFilename.EndsWith(".jpg") || saveFilename.EndsWith(".png") || saveFilename.EndsWith(".gif"))
using (FileStream fileStream = new FileStream(_destinationFolder + @"\" + saveFilename, FileMode.Create))
fileStream.Write(fileData, 0, fileData.Length);
else
using (FileStream fileStream = new FileStream(_destinationFolder + @"\" + saveFilename + ".jpg", FileMode.Create))
fileStream.Write(fileData, 0, fileData.Length);
++_downloadedCounter;
((WebClient)sender).Dispose();
}
}
問題があることではないリスト_images
からのすべての画像ダウンロード中です。ダウンロードボタンを2回クリックすると、さらにダウンロードされ、実際には数回クリックするだけですべてがダウンします。 WebClient
はタイムアウトしていますか?そうであれば自動的にダウンロードを再試行する方法がありますか?そうでない場合、この問題を解決する適切な方法は何ですか?
WebClientをタイムアウトで延長してください。 Webclientはタイムアウトの能力を持っていません。 http://stackoverflow.com/questions/1789627/how-to-change-the-timeout-on-a-net-webclient-object e.Error!= nullの場合は無視します。何が起こるのですか? –
@Stanleyあなたの質問を明確にすることができますか? –
いくつかのロギングまたは 'Console.WriteLine'文を追加して、実際に何が起こっているかを知ることができます。カウンター、ファイル名、あなたのURL、(@Stanleyが示唆しているように)イベントargsからエラーを書き出します。また、 'DownloadCompleted'呼び出しの終わりに' fileString.Flush() 'を追加してみてください。 – mdisibio