2016-06-11 57 views
1

我想从窗体窗体应用程序的web上加载图像, 一切都很好,代码可以正常工作,但问题是应用程序停止工作,直到加载完成。 我想查看并使用应用程序而无需等待加载将图像从Url异步加载到PictureBox

PictureBox img = new System.Windows.Forms.PictureBox(); 
var request = WebRequest.Create(ThumbnailUrl); 

using (var response = request.GetResponse()) 
using (var stream = response.GetResponseStream()) 
{ 
    img.Image = Bitmap.FromStream(stream); 
} 
+0

时间来研究'BackgroundWorker'和'asnyc'。 –

+0

谢谢你,我现在搜索 – ara

+0

做一个背景工作'dowork'事件而不是 – Rahul

回答

4

这里是解决方案:

public async Task<Image> GetImageAsync(string url) 
{ 
    var tcs = new TaskCompletionSource<Image>(); 
    Image webImage = null; 
    HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 
    request.Method = "GET"; 
    await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null) 
     .ContinueWith(task => 
     { 
      var webResponse = (HttpWebResponse) task.Result; 
      Stream responseStream = webResponse.GetResponseStream(); 
      if (webResponse.ContentEncoding.ToLower().Contains("gzip")) 
       responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
      else if (webResponse.ContentEncoding.ToLower().Contains("deflate")) 
       responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 

      if (responseStream != null) webImage = Image.FromStream(responseStream); 
      tcs.TrySetResult(webImage); 
      webResponse.Close(); 
      responseStream.Close(); 
     }); 
    return tcs.Task.Result; 
} 

下面是如何调用上面的解决方案:异步

PictureBox img = new System.Windows.Forms.PictureBox(); 
var result = GetImageAsync(ThumbnailUrl); 
result.ContinueWith(task => 
{ 
    img.Image = task.Result; 
}); 
+0

你错过了'**)**'之类的东西,因为代码不起作用 – ara

+0

@ara,我检查代码并修复它 –

+0

所以,谢谢你,这真是太棒了,dameeeet garm yaser jan – ara

2

PictureBox控制内置了支持加载图像。您不需要使用BackgroundWorker或异步/等待。它也可以从URL加载图像,所以你不需要使用网络请求。

您可以简单地使用LoadAsync方法或ImageLocation属性PictureBoxWaitOnLoad属性的值应该是false,这是默认值。

pictureBox1.LoadAsync("https://i.stack.imgur.com/K4tAc.jpg"); 

它等同于:

pictureBox1.ImageLocation = "https://i.stack.imgur.com/K4tAc.jpg";