• 关于Winform 2.0以后多线程不能更新UI的办法


    DotNet 2.0以后Winform在多线程Debug模式下更新UI会报这个错:

    线程间操作无效: 从不是创建控件“XXX”的线程访问它。


    解决办法如下:

    1.在Winform的构造函数中添加这么一句:

    Control.CheckForIllegalCrossThreadCalls = false;

    意思就是不检查跨线程调用,这样做是有风险的,特别是控件操作频繁时,会有意想不到的结果,这也是微软不建议用的原因,如果你的程序ui交互比较少,个人觉得用用也无妨

    2.利用Control的BeginInvoke和EndInvoke来更新,

    直接对Control类进行扩展,代码如下:

     1 /// <summary>
     2     /// Control扩展
     3     /// </summary>
     4     public static class UIExtend
     5     {
     6         /// <summary>
     7         /// 跨线程更新UI控件
     8         /// </summary>
     9         /// <param name="control"></param>
    10         /// <param name="handler"></param>
    11         public static void SafeInvoke(this Control control, Action handler)
    12         {
    13             if (control.InvokeRequired)
    14             {
    15                 while (!control.IsHandleCreated)
    16                 {
    17                     if (control.Disposing || control.IsDisposed)
    18                         return;
    19                 }
    20                 IAsyncResult result = control.BeginInvoke(new Action<Control, Action>(SafeInvoke), new object[] { control, handler });
    21                 control.EndInvoke(result);
    22                 return;
    23             }
    24             IAsyncResult result2 = control.BeginInvoke(handler);
    25             control.EndInvoke(result2);
    26         }
    27     }

    然后直接这样调用

     1 this.lstInfoXxx.SafeInvoke(() => { lstInfoXxx.Items.Add(respDecA.No1+ ":XXX更新成功!"); }); 

    还有一些方法,我就不介绍了,已经能解决问题了,详情可以看看这篇Blog,杨过大侠写的:

    传送门:http://www.cnblogs.com/yjmyzz/archive/2009/11/25/1610253.html

    看完后记得给大侠点赞,谢谢~

  • 相关阅读:
    git ssh key创建和github使用
    PHP7安装pdo_mysql扩展
    linux + centos 安装php7.2.7 + swoole 4.0.3
    linux 安装 sphinx+mariadb
    《高效会议的“九三”法则— 向三星学会如何开好会议》
    java高级教程 注入装配问题
    java高级教程 圆 圆柱 面积
    关于二叉树和栈
    用层序遍历求二叉树的wpl值
    线索二叉树的构造
  • 原文地址:https://www.cnblogs.com/michael90/p/6014800.html
Copyright © 2020-2023  润新知