c# - "Object is currently in use elsewhere"设置picturebox图片异常

标签 c# wpf winforms

标题,有几个问题,但没有一个能帮助我或指导我解决我的问题。

我正在使用 C# winform 构建实时或近乎实时的成像应用程序。

但是在winform中给PictureBox赋值

pictureBox.Image = image; 

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

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

此时,我不确定 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;
            }
      }

最佳答案

如果我没有正确理解您的问题,那么您正在从多个线程访问此图片框。 WinForms 在后台使用 GDI+,这不是线程安全的。 WinForms 不会强制您只能从创建它们的线程访问 UI 对象。它让您去做,但您最终会发现错误。

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

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

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

关于c# - "Object is currently in use elsewhere"设置picturebox图片异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355631/

相关文章:

c# - 在 Visual Studio 属性面板上禁用属性

c# - 如何在 Windows 应用程序中显示进度条?

c# - Xamarin 将 View 添加到布局但在屏幕上不可见

c# - 新 CAD GUI 的拖放绘图区域的语言和方法?

c# - .net 4.0 和 .net 4.0.3 有什么区别?

wpf - WPF TabControl-防止在选项卡更改时卸载?

c# - 如何将 View 逻辑设计到 C# 项目中

c# - ToolStripMenuItem 添加到几个地方?

c# - 反序列化 XMl 错误

c# - 分离 Entity Framework 实体是否也会分离其子实体?