通往成功之路

C# WinForm 跨线程访问控件

2018-11-28  本文已影响9人  此十八

问题出现:

在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)
上一篇下一篇

猜你喜欢

热点阅读