一、非UI线程(UI线程大部分为主线程)操作GUI控件的问题

如果从非UI线程操作windows窗体上的控件,就会和主线程产生竞争,造成死锁等现象。因此windows GUI编程有一个规则,就是只能通过创建控件的线程(UI线程)来操作控件的数据,否则就可能产生不可预料的结果。
      因此,在dotnet里面Control类实现了ISynchronizeInvoke接口,提供了Invoke和BeginInvoke方法来提供让其它线程更新GUI界面控件的机制。

ISynchronizeInvoke 定义如下:
     public interface ISynchronizeInvoke
     {
        [HostProtection(SecurityAction.LinkDemand, Synchronization=true, ExternalThreading=true)]
        IAsyncResult BeginInvoke(Delegate method, object[] args);
        object EndInvoke(IAsyncResult result);
        object Invoke(Delegate method, object[] args);
        bool InvokeRequired { get; }
     }
     如果从非UI线程操作windows窗体控件,那么就需要使用Invoke或者BeginInvoke方法,通过一个委托把调用封送到控件所属的线程上执行,具体操作如下:
    I、首先定义一个委托,当然直接使用该事件的委托也是可以的,如:

public delegate void UpdateClientListCallback();

II、 然后就是判断InvokeRequired 属性的值来决定是否要调用Invoke函数:

【InvokeRequired 属性:如果有两个线程,Thread A和Thread B,并且有一个Control c,是在Thread A里面new的。 那么在Thread A里面运行的任何方法调用c.InvokeRequired都会返回false。 相反,如果在Thread B里面运行的任何方法调用c.InvokeRequired都会返回true。 】

if (InvokeRequired)

{

//listBoxClientList 为Windows.Forms.ListBox 控件
                listBoxClientList.BeginInvoke(new UpdateClientListCallback(UpdateClientList), null);

或者

UpdateClientListCallback  deleListCallb= new InvokeCallback(UpdateClientList);
                listBoxClientList.BeginInvoke(deleListCallb, null); //Invoke为同步,方法类似
                
            }
            else
            {
                UpdateClientList();
            }

其中UpdateClientList()为具体方法。上面的BeginInvoke为异步调用,当非UI线程处理到此处是不需要等待处理完成(和UI线程异步处理),直接执行其他的内容。Invoke则需要非UI线程等UI线程处理完UpdateClientList()方法,再去执行其他的内容。

多线程之间数据和变量共享的方法:

1、private ArrayList m_workerSocketList = ArrayList.Synchronized(ArrayList()) //类似的可以用于其他乏类型。

2、静态变量

二、事件代理(EventHandler) 和委托(delegate)

http://langfangwangbin.blog.163.com/blog/static/100543634200982946189/

转载于:https://www.cnblogs.com/upDOoGIS/archive/2009/11/21/1607631.html

DotNet 学习笔记相关推荐

  1. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建...

    作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...

  2. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  3. .NET 云原生架构师训练营(系统架构)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章 ...

  4. Dapr牵手.NET学习笔记:状态管理之docker-compose发布

    Dapr牵手.NET学习笔记:想入非非的服务调用 Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用 Dapr牵手.NET学习笔记:用docker-compose部署服务 说明:为了给出demo的 ...

  5. ASP.NET Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记

    任务10:第三方ClientCredential模式调用 创建一个控制台程序 dotnet new console --name ThirdPartyDemo 添加 Nuget 包:IdentityM ...

  6. ASP.NET Core分布式项目实战(客户端集成IdentityServer)--学习笔记

    任务9:客户端集成IdentityServer 新建 API 项目 dotnet new webapi --name ClientCredentialApi 控制器添加验证 using Microso ...

  7. ASP.NET Core分布式项目实战(业务介绍,架构设计,oAuth2,IdentityServer4)--学习笔记...

    任务4:第一章计划与目录 敏捷产品开发流程 原型预览与业务介绍 整体架构设计 API 接口设计 / swagger Identity Server 4 搭建登录 账号 API 实现 配置中心 任务5: ...

  8. Unity超基础学习笔记(二)

    Unity超基础学习笔记(二) 1. 基本数据类型的扩展 之前在K12中学习了一些基本的数据类型,实际上C#支持更多的数据类型.如下: 注意无符号整型数和有符号整型数的表示范围,例如: int 能表示 ...

  9. 【C#编程基础学习笔记】6---变量的命名

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...

最新文章

  1. Gtk+2 Hello World:从源码到打包发布
  2. OVS对VXLAN解封包(二)
  3. radware Alten系列的HA配置
  4. 【opencv学习】Fast算法进行角点检测
  5. 神奇_程序cmd命令窗口运行会自动停止_加解决方案---Linux工作笔记045
  6. docker加载新的镜像后repository和tag名称都为none的解决方法
  7. JS定义数组,初始化
  8. 计算机软件行业职业病,IT行业的六大职业病,看看你有没有中
  9. oracle获取本月天数,Oracle查询日期所属月份的天数
  10. 分贝、电平、增益、音高、音分、声能、声强、声压...
  11. 【网页特效】12 个炫酷背景特效库
  12. Self-Attention详解
  13. 学习《C++ Primer Plus》习题篇1 第六版第6章习题
  14. android 全局换字体,Android 全局替换字体
  15. android手机主板,主板芯片全解
  16. 微信公众号平搜索排名,如何让公众号搜索排名靠前,公众号文章关键词排名规则
  17. 数值分布的分散程度对迭代次数的影响
  18. JavaSE 软件工程师 认证考试试卷3
  19. Context上下文穿插方式,不是设计模式,但胜于设计模式。
  20. 刷脸支付逐渐普及刷脸项目也逐渐火热起来

热门文章

  1. 二层交换机 不在同一子网_从二层交换机来说为什么三层交换机比路由器转发速率快...
  2. python mount回调函数_python requests模块中返回时间elapsed解析
  3. 【Spark】Spark 报错 error writing stream metadata exitcode=1073741515
  4. 【高并发】JUC中的Executor框架详解1
  5. Spark-Kudu报错:kudu.client.NonRecoverableException: The table was deleted: Table deleted at xxx
  6. Maven打包Package执行插件的顺序
  7. Esper 7.x集成SparkStream 2.x
  8. buffer string builder简单说明
  9. 一代经典框架 Layui 落幕,是否预示着一个时代的结束?
  10. 自定义控件常用方法总结