2013-04-24 22 views
8

Đây là mã tôi đang sử dụng cho hình ảnh ràng buộc trong XAMLSystem.OutOfMemoryException trong khi đọc và ràng buộc hình ảnh từ lưu trữ riêng biệt

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

Tương tự như vậy Tôi đang sử dụng 4 biên giới để hiển thị hình ảnh gần đây của tôi.

Trong ViewModel của tôi, tôi đang sử dụng phương pháp dưới đây để đọc hình ảnh từ bộ nhớ bị cô lập.

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

    } 

Và sau khi nhận được dòng tôi sẽ sử dụng phương pháp dưới đây viết bốn xây dựng WritableBitmap cho UI ràng buộc

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

Trong trường hợp này vấn đề của tôi là sau khi điều hướng đến và đi từ trang web của tôi cho 2-3 lần. Ứng dụng gặp sự cố trên phương thức BuildImage() nơi tôi đang sử dụng "image.SetSource (imageStream);" phương pháp. Tôi đã thử nhiều giải pháp thay thế nhưng thất bại. Ngoại lệ tôi nhận được là "System.OutOfMemoryException"

Tôi đã thử điều khiển Hình ảnh thay vì cọ vẽ Hình ảnh.

Tôi đã thử Bitmap thay vì WritableBitmap vv nhưng kết quả là giống nhau.

Tỷ lệ lỗi ứng dụng sẽ giảm nếu tôi sử dụng hình ảnh nhỏ. Nhưng tỷ lệ tai nạn là cao với những hình ảnh được chụp qua máy ảnh.

Tôi đang cố gắng giải quyết vấn đề này trong một tuần qua, nhưng không tìm thấy giải pháp thay thế nào để khắc phục sự cố.

Tôi tìm thấy một link rằng cuộc đàm phán về vấn đề tương tự nhưng đã không nhận được nhiều để giải quyết vấn đề này

Trả lời

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 lưu trữ hình ảnh theo mặc định để cải thiện hiệu suất. Bạn nên gọi image.UriSource = null sau khi sử dụng BitmapImage để xử lý tài nguyên.

+0

Tôi đã thử kết quả này nhưng cùng một kết quả. – StezPet

1

Bạn đang Reseting/xử lý các IsolatedStorageFileStreamIsolatedStorageFile sau khi bạn sử dụng chúng?

1

Bạn đã cố gắng buộc bộ thu gom rác chạy để xem điều đó có tạo ra sự khác biệt nào không.

GC.Collect(); 

này không được sử dụng như một giải pháp - bạn không bao giờ nên phải gọi GC.Collect, nhưng nó có thể giúp xác định xem vấn đề của bạn là một rò rỉ bộ nhớ hay chỉ là một sự chậm trễ trong bộ nhớ đang được khai hoang.

Các vấn đề liên quan