2013-04-24 5 views
8

Dies ist der Code, den ichSystem.OutOfMemoryException beim Lesen und Bindung Bild von isolierten Speichern

   <Border toolkit:TiltEffect.IsTiltEnabled="true" Height="350" Width="400" Grid.ColumnSpan="3"> 
         <Grid Height="350" Width="400" Margin="70,0,70,0" x:Name="Container1"> 
          <Grid.Background> 
           <ImageBrush ImageSource="{Binding ImageCollection[0]}" Stretch="Uniform" AlignmentX="Left" AlignmentY="Center"/> 
          </Grid.Background> 
          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="Tap"> 
            <i:InvokeCommandAction Command="{Binding ImageTapCommand}" CommandParameter="CONTAINER0"/> 
           </i:EventTrigger> 
          </i:Interaction.Triggers> 
         </Grid> 
        </Border> 

Ebenfalls in XAML für die Bindung Bild verwende ich bin mit 4 Grenze für die Anzeige von meinen letzten Bildern.

In meinem ViewModel verwende ich die folgende Methode zum Lesen von Bildern aus dem isolierten Speicher.

public Stream GetFileStream(string filename, ImageLocation location) 
    { 
     try 
     { 
      lock (SyncLock) 
      { 
       if (location == ImageLocation.RecentImage) 
       { 
        filename = Constants.IsoRecentImage + @"\" + filename; 
       } 
       using (var iSf = IsolatedStorageFile.GetUserStoreForApplication()) 
       { 
        if (!iSf.FileExists(filename)) return null; 
        var fs = iSf.OpenFile(filename, FileMode.Open, FileAccess.Read); 
        return fs; 
       } 
      } 

     } 
     catch (Exception ex) 
     { 
       return null; 
     } 

    } 

Und nachdem der Strom immer ich dieses unten geschrieben Methode vier Aufbau der WritableBitmap für UI-Bindung wird verwenden

 private WriteableBitmap BuildImage(Stream imageStream) 
    { 
     using (imageStream) 
     { 
      var image = new BitmapImage(); 
      image.SetSource(imageStream); 
      return new WriteableBitmap(image); 
     } 
    } 

In diesem Fall meine Frage nach dem zu navigieren ist und von meiner Seite für 2 bis 3 mal. Die App stürzt bei der BuildImage() -Methode ab, wo ich "image.SetSource (imageStream)" verwende. Methode. Ich habe viele Alternativen ausprobiert, aber gescheitert. Die Ausnahme, die ich bekomme, ist "System.OutOfMemoryException"

Ich habe Image-Steuerelement anstelle von Image-Pinsel versucht.

Ich habe Bitmap anstelle von WriteableBitmap usw. versucht, aber das Ergebnis ist das gleiche.

Die App-Absturzrate wird reduziert, wenn ich kleine Bilder verwende. Aber die Unfallrate ist hoch mit den Bildern, die durch die Kamera aufgenommen wurden.

Ich versuche für eine letzte Woche eine Lösung für dieses Problem, aber fand keine Alternative, um das Problem zu beheben.

fand ich ein link, die über ähnliche Frage spricht aber nicht viele haben das Problem durch Standard

Antwort

3
Try this, 

    var bitmapImage = new BitmapImage(); 
    bitmapImage.SetSource(stream); 
    bitmapImage.CreateOptions = BitmapCreateOptions.None; 
    var bmp = new WriteableBitmap((BitmapSource) bitmapImage); 
    bitmapImage.UriSource = (Uri) null; 
    return bmp; 
1

Silverlight-Caches Bilder zu lösen Leistung zu verbessern. Sie sollten image.UriSource = null aufrufen, nachdem Sie BitmapImage verwendet haben, um die Ressourcen zu entfernen.

+0

Ich versuchte dies, aber das gleiche Ergebnis. – StezPet

1

Sind Reseting Sie/die IsolatedStorageFileStream Entsorgung und die IsolatedStorageFile, nachdem Sie sie benutzen?

1

Haben Sie versucht, den Garbage Collector zu zwingen, zu laufen, um zu sehen, ob das einen Unterschied macht.

GC.Collect(); 

Dies ist nicht als Lösung gedacht - Sie sollen nie GC.Collect nennen, aber es könnte helfen, Ihr Problem ist ein Speicherleck oder eine Verzögerung in dem Speicher zurückgewonnen wird, festzustellen, ob.