有了标题,有几个问题,但没有一个可以帮助我或指导我解决我的问题.
我正在用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)
如果我正确理解您的问题,您将从多个线程访问此图片框.WinForms在引擎盖下使用GDI +,这不是线程安全的.WinForms不会强制您仅从创建它们的线程访问UI对象.它让你做到了,但你最终会发现错误,正如你所发现的那样.
尝试从工作线程向您的GUI线程发布消息,以使GUI线程更新图片.这应该可以解决您所看到的错误.
如果转移到WPF,您将遇到类似的线程问题.WPF严格强制只有创建UI对象的线程才能对其进行修改.在WPF中,您可以使用Invoke方法让正确的线程操纵您的图片框.
否则如上所述,两者之间的性能差异不会很大.您应该考虑是否需要或更喜欢立即模式绘制到保留模式.表格是即时的,WPF保留.
| 归档时间: |
|
| 查看次数: |
2314 次 |
| 最近记录: |