6

のインスタンスを作成するたびにメモリ リークが発生しますWriteableBitmap。stackoverflow や他のフォーラムで複数の提案を試みましたが、何も機能していません。私のテスト アプリの基本的なフローは次のとおりです。

  1. で画像を選ぶPhotoChooserTask
  2. オブジェクトから を使用して を作成Streamします。PhotoResultWriteableBitmap

それでおしまい。変数を無効にして呼び出しGC.Collect()ても、問題の一部しか解決されません。アプリがクラッシュするまでアプリがメモリを割り当てないようにしますが、オブジェクトが範囲外になっても、新しい画像を選択するまでは常にメモリが割り当てられます. デフォルトの Windows Phone Direct3D with XAML App で再現できました。デフォルト プロジェクトに対する唯一の変更点は次のとおりです。

MainPage.xaml.cs

public MainPage() {
    InitializeComponent();
    _photoChooserTask = new PhotoChooserTask();
    _photoChooserTask.Completed += new EventHandler<PhotoResult>(photoChooserTaskComplete);
}

private void ApplicationBarIconButton_Click(object sender, EventArgs e) {
    _photoChooserTask.Show();
}

private void photoChooserTaskComplete(object sender, PhotoResult e) {
    if (e.TaskResult == TaskResult.OK) {
        BitmapImage image = new BitmapImage();
        image.SetSource(e.ChosenPhoto);
        WriteableBitmap wbm = new WriteableBitmap(image);
        image.UriSource = null;
        image = null;
        wbm = null;
        GC.Collect();
    }
}

MainPage.xaml

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Mode="Default" Opacity="0.5" >
        <shell:ApplicationBar.Buttons>
            <shell:ApplicationBarIconButton IconUri="/junkUrl.png" Text="albums" Click="ApplicationBarIconButton_Click" />
        </shell:ApplicationBar.Buttons>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
4

1 に答える 1

-1

このためには、このファイル ストリームを IsolatedStorege 内に保存する必要があります。したがって、IsolatedStorageFileStream を使用してファイルストリームを作成し、次のように保存します...

private void photoChooserTaskComplete(object sender, PhotoResult e) {
if (e.TaskResult == TaskResult.OK) {
       SaveToIsolatedStorage(e.ChosenPhoto,"Your File Name");           
}

}

 public void SaveToIsolatedStorage(Stream imageStream, string fileName)
    {
        try
        {
            string imagename =  fileName + ".jpg";
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (myIsolatedStorage.FileExists(imagename))
                {
                    myIsolatedStorage.DeleteFile(imagename);
                }
                IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(imagename);
                WriteableBitmap wb = new WriteableBitmap(100, 100);
                wb.SetSource(imageStream);
                wb.SaveJpeg(fileStream, 100, 100, 0, 70);
                fileStream.Close();
            }
        }

        catch (Exception)
        {
            RadMessageBox.Show(String.Empty, MessageBoxButtons.OK, "Error occured while saving Images");                               
        }

    }

読み取りのために、IsolatedStorage からそのファイルを取得できます。

public WriteableBitmap ReadFromIsolatedStorage(string fileName)
    {
        WriteableBitmap bitmap = new WriteableBitmap(100, 100);
        try
        {
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (myIsolatedStorage.FileExists(fileName))
                {

                    using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(fileName, FileMode.Open, FileAccess.Read))
                    {
                        // Decode the JPEG stream.                            
                        bitmap = PictureDecoder.DecodeJpeg(fileStream, 100, 100);
                    }
                }
            }
        }
        catch (Exception)
        {
            RadMessageBox.Show(String.Empty, MessageBoxButtons.OK, "Error Occcured while reading image");                               
        }


        return bitmap;
    }

これでメモリリークの問題が解決します。これを試してください...

于 2013-08-21T04:11:21.090 に答える