一、原因分析
跨线程调用控件会出现这个错误的原因是因为:.NET禁止了跨线程调用控件, 否则谁都可以操作控件,最后可能造成错误。 所以不是在创建控件所在的线程内调用就会发生这样的错误。
二、解决办法
方法1:设置CheckForIllegalCrossThreadCalls =false 是能去掉这个检查的,但是这不是标准的作法.
方法2:定义一个委托(delegate),委托(delegate)可以将参数与方法传递给控件所在的线程,并由控件所在的线程执行,通过Invoke来调用,这样可以完美的解决此类问题。
Action action = () =>
{
TimeBox.Text = TimeString;
ResultBox.Text = hv_ResultStr;
DisplayImageHalconWindow(AcqImage, GrayImage);
DisplayImageHalconWindow(ThresholdImage, MeanImage);
};
Invoke(action);
三、总结
在控件的线程中遇到阻塞时可以通过创建另一个线程来解决界面的阻塞问题,例:new Thread(ImageDealThread).Start();将控件所需要处理的事件封装到一个函数里面,通过线程进行调用,跨线程访问控件可以通过定义一个委托(delegate)来将参数与方法传递给控件所在的线程,再通过Invoke来调用。
错误之处,欢迎大家指出!
版权归原作者 邵_金波 所有, 如有侵权,请联系我们删除。