2016-06-11 13 views
1

Ich möchte Bild aus dem Web auf Windows-Formulare-Anwendung laden, Alles ist gut und Code funktioniert gut, aber das Problem ist die App aufhören zu arbeiten, bis das Laden zu Ende geht. Ich möchte sehen und mit der App arbeiten, ohne auf das Laden warten. HierAsynchron laden ein Bild von einer URL zu einer 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

Zeit 'BackgroundWorker' und' asnyc' zu erforschen. –

+0

danke, ich suche jetzt – ara

+0

Tun Sie es in einem Hintergrundarbeiter 'Dowork' Ereignis eher – Rahul

Antwort

4

ist die Lösung:

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; 
} 

Hier ist, wie die obige Lösung nennen:

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

fehlt dir etwas wie '**) **', weil der Code nicht funktioniert – ara

+0

@ara, ich überprüfe den Code und behebe ihn –

+0

Also danke, es war fantastisch, dameeeet garm yaser jan – ara

2

PictureBox Steuerung hat eine integrierte Unterstützung für das Laden von Bildern asynchron. Sie müssen weder BackgroundWorker noch async/await verwenden. Es kann auch ein Bild von einer URL laden, so dass Sie keine Webanfrage benötigen.

Sie können einfach die LoadAsync Methode oder ImageLocation Eigenschaft von PictureBox verwenden. Der Wert von WaitOnLoad Property sollte false sein, was der Standardwert ist.

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

Es ist äquivalent zu:

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