2015-02-06 24 views
0

我試着從URL列表中下載了一些照片,並將它們添加到一個位圖列表:下載多張影像的HttpWebRequest

  for (int i = 0; i < matches.Count; i++) 
      { 
       Bitmap img = DownloadImage(matches[i].Groups[1].Value); 
       if (img != null) 
       { 
        img = img.Clone(new Rectangle(0, 0, img.Width, img.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
        imagelist.Add(img); 
       } 
      } 

這裏是downloadImage功能:

private static Bitmap DownloadImage(string uri) 
    { 
     try 
     { 
      Bitmap bm = null; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
      request.Proxy = null; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      if ((response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect) && response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase)) 
      { 

       using (Stream inputStream = response.GetResponseStream()) 
       { 
        bm = new Bitmap(inputStream); 
       } 
      } 
      return bm; 
     } 
     catch 
     { 
      return null; 
     } 
    } 

的問題是,它減慢這種方式,我需要一種方式來同時下載它們,而不是等待一個完成來開始下一個。 即時通訊使用.net 4.0,所以我不能使用4.5新的異步方法。 幫助,將不勝感激。

+0

你不能使用線程? – 2015-02-06 05:59:30

+1

網址列表有時包含100個網址,我無法打開100個線程。 – Meydan 2015-02-06 06:02:11

+0

檢查https://msdn.microsoft.com/en-us/library/86wf6409(v=vs.100).aspx。異步方法可用於.net 4.0 – Amit 2015-02-06 06:03:16

回答

0

您可以使用request.GetResponseAsyncContinueWith結合使用,以在不使用線程的情況下異步獲取圖像。

private static Task<Bitmap> DownloadImage(string uri) 
{ 
    try 
    { 
     Bitmap bm = null; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Proxy = null; 
     Task<System.Net.HttpWebResponse> responseTask = (HttpWebResponse)request.GetResponseAsync(); 

     return responseTask.ContinueWith(t => 
     { 
     if(t.Exception != null) 
     { 
      // exception happened, Log? 
     } 
     var response = t.Result; 
     if ((response.StatusCode == HttpStatusCode.OK || 
      response.StatusCode == HttpStatusCode.Moved || 
      response.StatusCode == HttpStatusCode.Redirect) && 
      response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase)) 
     { 
      using (Stream inputStream = response.GetResponseStream()) 
      { 
       bm = new Bitmap(inputStream); 
      } 
     } 
     }); 
    } 
    catch 
    { 
     return null; 
    } 
} 

然後每個任務保存在任務列表,並使用另一繼續或Task.WaitAll等待其完成。您也可以使用帶有.NET 4.0的AsyncCTP,它允許您使用異步等待。

+0

不能使用.GetResponseAsync();在網絡4.0 – Meydan 2015-02-06 06:37:59

+0

也許你可以嘗試'WebClient.DownloadDataAsync'? https://msdn.microsoft.com/en-us/library/ms144190(v=vs.110).aspx – 2015-02-06 06:46:36