问题出现:
在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框:
image
** 解决方案:**
** 方案一:去掉线程访问主线程UI控件的安全检查,使用:**
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: rgb(0, 0, 0); font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"> Control.CheckForIllegalCrossThreadCalls = false;</pre>
image** 方案二:使用委托,将对主线程的UI控件操作推送了该线程的消息队列里,使用的方法为:Invoke方法和BeginInvoke方法,前一个是同步方法,后一个为异步方法;**
使用同步invoke方法的程序代码如下,已经通过测试:
![image](https://img.haomeiwen.com/i8512409/a97b5a3bb46d393d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
注 :使用异步BeginInvoke方法的过程和同步invoke方法一样,把invoke方法换成BeginInvoke方法就可以;
**方案三:使用同步上下文:SynchronizationContext方法,该方法是取得主线程的上下文信息,然后在子线程将访问UI控件方法推送到UI上下文的消息队列里,使用POST或者Send;**
![image](https://img.haomeiwen.com/i8512409/f63d990290891a59.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**方案四:在**命名空间: ** [System.ComponentModel](https://msdn.microsoft.com/zh-cn/library/system.componentmodel.aspx) 里有个**BackgroundWorker类,它是在一个单独的线程里执行,下图拷贝官网说明:
![image](https://img.haomeiwen.com/i8512409/18d2ebf3b00aebcd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码 如下,测试通过 :
![image](https://img.haomeiwen.com/i8512409/2bf5b37dc0704c27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
** 问题扩展:**
为什么 在 winform上添加TextBox控件,然后通过另一个线程访问UI主线程的控件,不报错,正常通过???烦请高手赐教!!!
图如下:
![image](https://img.haomeiwen.com/i8512409/1f5ead6377206ff6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
网友评论