Mi aplicación ejecuta algorythms pesado CPU para editar una imagen colocada en una ventana de WPF. Necesito que la edición se haga en un hilo de fondo. Sin embargo, intentar editar el BackBuffer de WritableBitmap en un subproceso que no sea de UI arroja InvalidOperationException.¿Cómo editar un WritableBitmap.BackBuffer en un subproceso que no sea de IU?
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();
}
He leído docenas de manuales, todos ellos me dice que haga la edición BackBuffer en hilo de interfaz de usuario (es decir MSDN).
Cómo editar el WritableBitmap.BackBuffer en un subproceso sin interfaz de usuario sin copia/clonación de búfer inútil?
No creo que este sea el enfoque correcto. Las dos llamadas Invoke se bloquearán por más tiempo que el tiempo que tomaría escribir el búfer. – Brannon
Estoy totalmente de acuerdo con los escenarios en los que la actualización del búfer de píxeles es un proceso rápido. Si la actualización del búfer implica algún cálculo caro (es decir, que cuesta más que las dos llamadas de invocación), lo anterior aún debería ser un enfoque perfectamente viable. – LOAS