2013-08-21 10 views
6

Ich habe einen Speicherverlust, wenn ich jede Instanz eines WriteableBitmap erstellen. Ich habe mehrere Vorschläge für Stackoverflow und andere Foren ausprobiert, aber nichts funktioniert. Der grundlegende Ablauf meiner Test-App ist dies:WriteableBitmap Speicherverlust in Windows Phone 8

  1. Wählen Sie ein Bild mit dem PhotoChooserTask
  2. Verwenden Sie die Stream vom PhotoResult Objekt eine WriteableBitmap zu erstellen.

Das ist es. Nullen der Variablen und Aufruf GC.Collect() löst nur einen Teil des Problems. Es behält die App von der Zuweisung von Speicher, bis die App abstürzt, aber obwohl die Objekte den Gültigkeitsbereich verlassen haben, wird ihnen immer Speicher zugewiesen, bis ich ein neues Bild auswähle. Ich kann es mit dem Standard Windows Phone Direct3D mit XAML App reproduzieren. Die einzigen Änderungen an der Standardprojekt sind folgende:

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

Hallo, ich habe dieses Problem auch, irgendeine Lösung schon? –

Antwort

-1

Dazu Sie diese Datei Strom innerhalb des IsolatedStorege speichern müssen. So erstellen Sie einen Filestream IsolatedStorageFileStream verwenden und es dann speichern, wie dieser ...

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

    } 

Und zum Lesen Sie die Datei aus IsolatedStorage bekommen

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

Dieser Willen löste dein Gedächtnisverlustproblem, versuchen Sie dieses ...

+1

Das obige funktioniert nicht. Ich habe es so implementiert, wie Sie es angewiesen haben, aber der Speicher wird nie freigegeben, wenn die Objekte den Gültigkeitsbereich verlassen. Die WriteableBitmap, die aus dem ursprünglichen Stream erstellt wird, wird nie gesammelt, bis ich ein neues Objekt durch Auswahl eines anderen Bildes erstellt habe. Das Lesen des Images aus dem isolierten Speicher scheint in Ordnung zu sein und dem erwarteten Speicherbereinigungsverhalten zu folgen. – Wagan8r