![]() |
1
1
顾名思义,
注意这是
见
Windows Forms section of my threading tutorial
更多细节。整个教程可以做的更新,但我相信这一点是好的。在其他情况下,您也可以考虑使用
|
![]() |
2
1
我认为你对InvokeRequired的理解有误。invokeRequired表示当前线程与UI线程不同,现在访问控件状态是不安全的。如果是这样的话你就得用
在您的情况下,除非PictureBox图像正在更改,否则我建议您最好提前复制图像并使用它。否则你需要使用
|
![]() |
3
1
你有太多的线索要结束这一切。计时器和委托的beginInvoke()方法都将使用线程池线程。问题是picturebox.image属性只是部分线程安全的。一次只能有一个线程访问它。当ui线程在调用clone()方法的同时绘制图像时,代码将异常终止。 你的lock语句不能解决这个问题,picturebox正在访问image属性而不使用同一个锁。我强烈建议首先去掉线程,使用system.windows.forms.timer而不是system.threading.timer。它的tick事件是在ui线程上引发的。但是,这将使ui线程在事件运行时没有响应,这取决于用户是否注意到这一点需要多长时间。比如说,超过100毫秒是个问题。 唯一的另一种方法是尝试使picturebox控件线程安全。这在某种程度上是可能的。向项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱的顶部放到您的窗体上,替换现有的PB。请注意,这只是一个局部解决方案,显示动画gif或使用imagelocation属性仍然会爆炸。使用提供的克隆方法,而不是对映像属性调用克隆。
|