等待C#中的ImageOpened事件处理程序

时间:2014-07-26 12:32:31

标签: windows winforms windows-phone-7 windows-phone-8

我有一张我需要从网上获取的图片,但我需要等待图片下载后再做其他事情。 所以这是我的代码

BitmapImage bm = new BitmapImage(new Uri(imageUri));
bm.CreateOptions = BitmapCreateOptions.None;
bm.ImageOpened += (sd, args) => {
    Debug.WriteLine("loaded");
    mre.Set();

};
mre.WaitOne();
Debug.WriteLine(imageUri);

问题是ImageOpened事件处理程序中的代码永远不会运行。所以我的程序就此停止 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

您应该使用WebClient下载Web图像。这是一个异步方法:

    private Task<BitmapImage> downloadImage(string imageUri)
    {
      TaskCompletionSource<BitmapImage> tcs = new TaskCompletionSource<BitmapImage>();
      IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();

      WebClient wc = new WebClient();
      wc.OpenReadCompleted += (s, e) =>
      {
          if (e.Error == null && !e.Cancelled)
          {
              BitmapImage bmp = new BitmapImage();
              bmp.SetSource(e.Result);

              tcs.SetResult(bmp);
          }
            else { tcs.SetResult(null); }
      };
      wc.OpenReadAsync(new Uri(imageUri, UriKind.Absolute));

      return tcs.Task;
  }

以下是如何使用它:

BitmapImage img = await downloadImage("web url goes here");
if (img == null) 
{
    //Error handling goes here
}