从其他线程读取图像的正确方法

时间:2016-08-24 13:51:16

标签: c# wpf multithreading

我有一个运行Thread的类,其中包含一些数据处理:

void thread_function()
{
  while (client != null)
  {
  ....some stuff...
  wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap
  OnFrameRdy(this, MyEventsArgs);
  }
}

如何在没有内存复制的情况下从wrBitmap进程读取Thread?我需要将wrBitmap绑定到我的Image wpf控件。那可能吗?

或者唯一的方法是将wrBitmap复制到课堂上的其他变量中并在我的控件中读取它? 我不想复制变量,因为它会给我带来巨大的内存开销。

我以为我可以使用事件并创建我的OnFrameRdy事件,但仍然不允许我使用数据。 如果我可以输入Image.source = MyClass.wrBitmap

,那真的很酷

1 个答案:

答案 0 :(得分:0)

猜测你从InvalidOperationException尝试从不同的线程设置Source属性或在不同的线程中使用Bitmap而不是创建(你< strong>认真应该更清楚你要解决的问题是什么。

如果我是对的,你应该Freeze你的位图(这不允许对它进行更改)并在UI线程上调用Image.Source的赋值。这应该适合你:

void thread_function()
{
    while (client != null)
    {
        ....some stuff...
        wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap
        wrBitmap.Freeze();
        Dispatcher.BeginInvoke((Action)(() => Image.Source = wrBitmap));
    }
}