Tôi chỉ xem xét điều này và phải ném vào hai xu của mình, mặc dù một vài năm sau bài đăng gốc (chỉ trong trường hợp bất kỳ ai khác tìm kiếm cùng một thứ mà tôi đang xem).
Tôi có một ảnh kiểm soát mà cần phải có nó hình ảnh nạp trong nền sử dụng một Stream là, và sau đó hiển thị.
Vấn đề mà tôi vẫn tiếp tục chạy vào đó là các BitmapSource, nó Suối nguồn và ảnh kiểm soát tất cả phải được trên cùng một sợi.
Trong trường hợp này, bằng cách sử dụng một ràng buộc và thiết lập nó IsAsynch = true sẽ ném một ngoại lệ chủ đề chéo.
Một BackgroundWorker là tuyệt vời cho WinForms, và bạn có thể sử dụng trong WPF, nhưng tôi muốn tránh sử dụng các hội đồng WinForm trong WPF (bloating của một dự án không được khuyến khích, và nó là một nguyên tắc tốt quá). Điều này sẽ ném một ngoại lệ tham chiếu chéo không hợp lệ trong trường hợp này quá, nhưng tôi đã không kiểm tra nó.
Chỉ ra rằng một dòng mã sẽ làm cho bất kỳ các công việc:
//Create the image control
Image img = new Image {HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch, VerticalAlignment = System.Windows.VerticalAlignment.Stretch};
//Create a seperate thread to load the image
ThreadStart thread = delegate
{
//Load the image in a seperate thread
BitmapImage bmpImage = new BitmapImage();
MemoryStream ms = new MemoryStream();
//A custom class that reads the bytes of off the HD and shoves them into the MemoryStream. You could just replace the MemoryStream with something like this: FileStream fs = File.Open(@"C:\ImageFileName.jpg", FileMode.Open);
MediaCoder.MediaDecoder.DecodeMediaWithStream(ImageItem, true, ms);
bmpImage.BeginInit();
bmpImage.StreamSource = ms;
bmpImage.EndInit();
//**THIS LINE locks the BitmapImage so that it can be transported across threads!!
bmpImage.Freeze();
//Call the UI thread using the Dispatcher to update the Image control
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
img.Source = bmpImage;
img.Unloaded += delegate
{
ms.Close();
ms.Dispose();
};
grdImageContainer.Children.Add(img);
}));
};
//Start previously mentioned thread...
new Thread(thread).Start();
các BitmapImage phải được tạo ra trên UI chủ đề: điều này sẽ ném một ngoại lệ ... –
@ Jmix90: nó không phải là rõ ràng những gì một phần của câu trả lời này, bạn đang đề cập đến. Tuy nhiên: sử dụng 'Binding.IsAsync' cho phép một đường dẫn Uri/được chỉ định trong' Image.Source' và tải hình ảnh một cách không đồng bộ một cách tự động. WPF sẽ xử lý bất kỳ vấn đề nào về chuỗi chéo trong kịch bản này. Nếu một người đang tạo bitmap trong một chủ đề nền, một trong những nhu cầu đơn giản là gọi 'Freeze()' trên đối tượng bitmap trước khi đưa nó vào chuỗi giao diện người dùng. Nó chỉ ném một ngoại lệ nếu bạn làm điều đó sai. –