美文网首页通往成功之路
C# WinForm 跨线程访问控件

C# WinForm 跨线程访问控件

作者: 此十八 | 来源:发表于2018-11-28 15:25 被阅读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)
    

    相关文章

      网友评论

        本文标题:C# WinForm 跨线程访问控件

        本文链接:https://www.haomeiwen.com/subject/dytzqqtx.html