2012-10-07 2 views
3

Я сделал проект для изображений кеша. Я хочу подождать в основном потоке для полной функции DownloadImage, а затем вернуть это сохраненное растровое изображение. Это возможно? Я делаю это даже правильно?Windows Phone - Кэш изображения - дождитесь загрузки изображения

public static ImageSource GetImage(int id) 
    { 
     BitmapImage bitmap = new BitmapImage(); 
     String fileName=string.Format("ImageCache/{0}.jpg", id); 

     using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      if (!myIsolatedStorage.DirectoryExists("ImageCache")) 
      { 
       myIsolatedStorage.CreateDirectory("ImageCache"); 
      } 

      if (myIsolatedStorage.FileExists(fileName)) 
      { 
       using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(fileName, FileMode.Open, FileAccess.Read)) 
       { 
        bitmap.SetSource(fileStream); 
       } 
      } 
      else 
      { 
       DownloadImage(id); 
       //HERE - how to wait for end of DownloadImage and then do that below?? 
       using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(fileName, FileMode.Open, FileAccess.Read)) 
       { 
        bitmap.SetSource(fileStream); 
       } 
      } 
     } 
     return bitmap; 
    } 

Вот функция DownloadImage:

private static void DownloadImage(Object id) 
    { 
     WebClient client = new WebClient(); 
     client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
     client.OpenReadAsync(new Uri(string.Format("http://example.com/{0}.jpg", id)), id); 
    } 
    private static void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      if (e.Error == null && !e.Cancelled) 
      { 
       try 
       { 
        string fileName = string.Format("ImageCache/{0}.jpg", e.UserState); 
        IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(fileName); 

        BitmapImage image = new BitmapImage(); 
        image.SetSource(e.Result); 
        WriteableBitmap wb = new WriteableBitmap(image); 

        // Encode WriteableBitmap object to a JPEG stream. 
        Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85); 
        fileStream.Close(); 

       } 
       catch (Exception ex) 
       { 
        //Exception handle appropriately for your app 
       } 
      } 
     } 

    } 

ответ

0

У вас есть много способов, чтобы достичь того, чего вы хотите. Можно подождать командой async await, которая является частью Visual Studio Async. Вы можете скачать последнюю версию CTP от here. More how to use it.

Лично я бы использовал события.

+0

Спасибо за ваш ответ. Когда я пытаюсь использовать async жду, я получаю ошибку преобразования задачи в ImageSource. Можете ли вы привести пример, как правильно это сделать? или лучше, если вы напишете что-то, как это сделать, используя события? – bmit

+0

Просто переместите с помощью (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile (fileName, FileMode.Open, FileAccess.Read)) { bitmap.SetSource (fileStream); } до конца client_OpenReadCompleted, и все в порядке. –

+0

Но тогда я не смогу вернуть растровое изображение как возврат 'public static ImageSource GetImage (int id)' – bmit

Смежные вопросы