Ứng dụng của tôi chạy algorythms CPU nặng để chỉnh sửa hình ảnh được đặt tại cửa sổ WPF. Tôi cần phiên bản được thực hiện trong một chủ đề nền. Tuy nhiên, cố gắng chỉnh sửa BackBuffer của WritableBitmap trong chuỗi giao diện người dùng không phải là InvalidOperationException.Làm thế nào để chỉnh sửa một WritableBitmap.BackBuffer trong thread UI không?
private WriteableBitmap writeableBitmap;
private void button1_Click(object sender, RoutedEventArgs e)
{
// Create WritableBitmap in UI thread.
this.writeableBitmap = new WriteableBitmap(10, 10, 96, 96, PixelFormats.Bgr24, null);
this.image1.Source = this.writeableBitmap;
// Run code in non UI thread.
new Thread(
() =>
{
// 'Edit' bitmap in non UI thread.
this.writeableBitmap.Lock(); // Exception: The calling thread cannot access this object because a different thread owns it.
// ... At this place the CPU is highly loaded, we edit this.writeableBitmap.BackBuffer.
this.writeableBitmap.Unlock();
}).Start();
}
Tôi đã đọc hàng chục sách hướng dẫn, tất cả đều cho tôi biết ấn bản BackBuffer trong chuỗi giao diện người dùng (ví dụ: MSDN).
Cách chỉnh sửa WritableBitmap.BackBuffer trong một chuỗi giao diện người dùng không có bất kỳ sao chép/sao chép bộ đệm vô dụng nào?
Tôi không nghĩ đây là phương pháp phù hợp. Hai cuộc gọi Invoke sẽ chặn lâu hơn thời gian cần thiết để viết bộ đệm. – Brannon
Tôi hoàn toàn đồng ý với các tình huống khi cập nhật bộ đệm pixel là một quá trình nhanh chóng. Nếu cập nhật bộ đệm liên quan đến một số tính toán đắt tiền (tức là chi phí nhiều hơn hai cuộc gọi gọi) thì ở trên vẫn phải là một cách tiếp cận hoàn toàn khả thi. – LOAS