2013-08-21 14 views
6

Mam wyciek pamięci, gdy tylko utworzę instancję z WriteableBitmap. Próbowałem wielu sugestii na stackoverflow i innych forach, ale nic nie działa. Podstawowy przepływ mojej aplikacji testowej jest taka:Wystąpienie pamięci WriteableBitmap w systemie Windows Phone 8

  1. Wybierz obraz z PhotoChooserTask
  2. Użyj Stream od obiektu PhotoResult stworzyć WriteableBitmap.

To wszystko. Nulling zmiennych i wywoływanie GC.Collect() rozwiązuje tylko część problemu. Uniemożliwia to aplikacji przydzielanie pamięci do momentu awarii aplikacji, ale nawet jeśli obiekty wykroczyły poza zakres, zawsze przydzielana jest pamięć, dopóki nie zostanie wybrany nowy obraz. Mogę go odtworzyć za pomocą domyślnego Windows Phone Direct3D z aplikacją XAML. Jedyne modyfikacje projektu domyślne są następujące:

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> 
+0

Witam, znam ten problem, jakieś rozwiązanie? –

Odpowiedz

-1

Do tego trzeba zapisać ten plik strumienia wewnątrz IsolatedStorege. Więc utworzyć FILESTREAM przy użyciu IsolatedStorageFileStream a następnie zapisać go, jak to ...

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");        
     } 

    } 

A do czytania można dostać ten plik z 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; 
    } 

Będzie Rozwiązał problem z wyciekiem pamięci, spróbuj tego ...

+1

Powyższe nie działa. Zaimplementowałem go zgodnie z instrukcjami użytkownika, ale pamięć nie zostanie zwolniona, gdy obiekty wykroczą poza zakres. WriteableBitmap, która jest tworzona z początkowego strumienia, nigdy nie jest gromadzona, dopóki nie utworzę nowego obiektu, wybierając inny obraz. Odczytanie obrazu z odizolowanej pamięci wydaje się być w porządku i zgodnie z oczekiwanym zachowaniem podczas odśmiecania. – Wagan8r

Powiązane problemy