2016-06-11 14 views
1

Windowsフォームアプリケーションのウェブから画像をロードしたい すべてがうまくいき、コードはうまく動作しますが、読み込みが完了するまでアプリが動作しなくなるという問題があります。 の読み込みを待つことなく、のアプリを見て作業したいです。ここで非同期にURLから画像を画像ボックスにロード

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

時間:

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

それはと同等です。 –

+0

ありがとうございました、私は今検索します – ara

+0

Backgroundworkerの '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またはasync/awaitを使用する必要はありません。また、URLからイメージをロードできるため、Webリクエストを使用する必要はありません。

LoadAsyncメソッドまたはImageLocationプロパティをPictureBoxに設定するだけで簡単に使用できます。 WaitOnLoadプロパティの値は、デフォルトであるfalseである必要があります。 `BackgroundWorker`と` asnyc`を検索するには

pictureBox1.ImageLocation = "https://i.stack.imgur.com/K4tAc.jpg"; 
関連する問題