在图片框中设置图像时,"对象当前正在其他地方使用"异常

Tae*_*hin 4 c# wpf winforms

有了标题,有几个问题,但没有一个可以帮助我或指导我解决我的问题.

我正在用C#winform构建一个实时或接近实时的成像应用程序.

但是在winform中为PictureBox分配图像

pictureBox.Image = image; 
Run Code Online (Sandbox Code Playgroud)

基本上Object is currently in use elsewhere.在5-20分钟内给出一个随机异常.

我搜索了这个问题的材料,但找不到合适的解决方案.程序只是将图像设置为从队列中显示时发生错误.因此,无法在其他线程中使用该图像.

在这一点上,我不确定winform是成像应用程序的正确平台.我是否必须转移到WPF等其他平台?

我需要经验丰富的建议.

更新:正如Nathanael指出的那样,我可以从多线程访问picturebox,所以我认为多线程可以访问picturebox的图像.因此,当我将上面的行更改为以下时,我不会再出现任何错误.

      private void SetImage(Bitmap image) 
      {
            if (this.pictureBox.InvokeRequired)
            {
                SetImageCallback callback = new SetImageCallback(SetImage);
                this.BeginInvoke(callback, new object[] { image });
            }
            else
            {
                pictureBox.Image = image;
            }
      }
Run Code Online (Sandbox Code Playgroud)

Nat*_*ael 5

如果我正确理解您的问题,您将从多个线程访问此图片框.WinForms在引擎盖下使用GDI +,这不是线程安全的.WinForms不会强制您仅从创建它们的线程访问UI对象.它让你做到了,但你最终会发现错误,正如你所发现的那样.

尝试从工作线程向您的GUI线程发布消息,以使GUI线程更新图片.这应该可以解决您所看到的错误.

如果转移到WPF,您将遇到类似的线程问题.WPF严格强制只有创建UI对象的线程才能对其进行修改.在WPF中,您可以使用Invoke方法让正确的线程操纵您的图片框.

否则如上所述,两者之间的性能差异不会很大.您应该考虑是否需要或更喜欢立即模式绘制到保留模式.表格是即时的,WPF保留.