2010-02-25 39 views
9

Tôi đang cố gắng sử dụng Caching Application Block để cache một số hình ảnh (những hình ảnh này mất nhiều thời gian để render)không thể truy cập Closed Suối

BitmapSource bitmapSource; ///some bitmap source already created 
    _cache /// Caching Application Block 
    String someId; //id for this image, used as the key for the cache 

    using (var stream = new MemoryStream()) 
    { 
     PngBitmapEncoder encoder = new PngBitmapEncoder(); 
     encoder.Interlace = PngInterlaceOption.On; 
     encoder.Frames.Add(BitmapFrame.Create(bitmapSource));    
     encoder.Save(stream); 
     _cache.Add(someId, stream); 
    } 

Và sau đó tải chúng bằng:

imStream = (Stream)_cache.GetData(someId)); 
if (imStream != null) 
{ 
    PngBitmapDecoder decoder = new PngBitmapDecoder(imStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
    return decoder.Frames[0]; //return the bitmap source 
} 

Nhưng trong khi tải, tôi nhận được ngoại lệ sau tại dòng "mới PngBitmapDecoder":

"Không thể truy cập vào Luồng đã đóng.

Tôi hiểu rằng tôi đã đóng luồng trong mã ở trên, nhưng không phải là _cache.Add() tạo bản sao (qua Serialization) trước khi thoát? Quy trình tuần tự hóa luồng chính xác là gì?

THanks!

Trả lời

6

nhưng không phải là _cache.Thêm() tạo bản sao (qua nối tiếp) trước khi thoát?

Không nhất thiết. Nếu nó "đang trong quá trình" nó sẽ chỉ lưu trữ tham chiếu đối tượng; Stream là không thực sự rất serializable anyway (một Stream là một ống, không phải là một xô).

Bạn muốn lưu trữ các BLOB - không phải là Stream:

_cache.Add(someId, stream.ToArray()); 

... 

byte[] blob = _cache.GetData(someId); 
if(blob != null) { 
    using(Stream inStream = new MemoryStream(blob)) { 
     // (read) 
    } 
} 
+0

cảm ơn! cả hai câu trả lời hay, tôi chỉ đánh dấu câu trả lời đầu tiên :) tôi thích tham chiếu lưu trữ/nhóm. – moogs

+2

@moogs - thực ra cái này xuất hiện đầu tiên (04:55:29 và 04:46:05). – Alconja

+0

đó là lạ ... các "trả lời xx phút trước" là cao hơn cho bài đăng này trước đó. hmm. – moogs

9

Vấn đề là dòng được đóng lại (qua Dispose()) vào cuối của khối using. Bạn giữ lại tham chiếu đến luồng đã đóng.

Thay vào đó, lưu nội dung của các dòng để bộ nhớ cache của bạn:

_cache.Add(someId, stream.ToArray()); 

Khi bạn gọi constructor PngBitmapDecoder, bạn sẽ phải tạo ra một mới MemoryStream để đọc từ đó mảng byte.

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