3

画像をキャッシュするプロジェクトを作成しました。完全な DownloadImage 関数をメインスレッドで待機してから、保存したビットマップを返します。それは可能ですか?私はそれをきちんとやっていますか?

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

    }
4

2 に答える 2

0

あなたが望むものを達成する方法はたくさんあります。async awaitVisual Studio Async の一部であるコマンドで待機することができます。最新の CTP は、ここからダウンロードできます。使い方は以上です。

個人的には、イベントを使用します。

于 2012-10-08T20:24:43.287 に答える
0

これには、いくつかの詳細とコード例が含まれています: http://www.ben.geek.nz/2010/07/one-time-cached-images-in-windows-phone-7/

于 2013-07-03T12:15:58.913 に答える