一直以来都是接触B/S开发,很少做C/S开发,线程就用得更少了,最近做一些工作中用到的小软件终于用上了线程,记录一些心得.
场景:
      1:假设有窗体F,里面有一按钮BtnA,及一Label控件.
      2:有一类A,里面有一方法Start().
要求:
      点击按钮BtnA后,根据Start()方法里面操作逻辑,将状态显示在Label中.

最开始做的时候是实例化类A的时候将整个窗体或者要改变值的控件传入类A中,然后再在类A中操作,可想而知这样是非常不好的.
查阅资料后,终于找到了一点解决方法:利用委托或事件,以下是基本代码.

Code 窗体代码
 1 private void BtnA_Click(object sender, EventArgs e)
 2        {
 3            A ms = new A();
 4            //委托方法{实例化类A中定义的委托}
 5            //ms.tt= new A.dSetSourceInfo(this.SetInfoOne);
 6            //或
 7            //事件触发{注册类A中定义的事件}
 8            ms.SetInfo += new EventHandler(ms_SetInfoTwo);
 9            Thread m = new Thread(new ThreadStart(ms.Start));
10            m.Start();
11        }
12
13
14//委托
15
16        private delegate void mySetInfo(string s);
17        void SetInfoOne(string s)
18        {
19            if (this.InvokeRequired)
20            {
21                this.Invoke(new mySetInfo(SetInfoOne), s);
22                return;
23            }
24            this.Label1.Text = s;
25        }
26
27
28//事件
29
30        void ms_SetInfoTwo(object sender, EventArgs e)
31        {
32            if (this.InvokeRequired)
33            {
34               this.Invoke(new System.EventHandler(ms_SetInfoTwo), sender);
35               return;
36            }
37            this.Label1.Text = (string)sender;
38        }
Code 类A
 1  public class A 
 2    {
 3        //定义事件
 4        public event EventHandler SetInfo;
 5        //类A中执行的事件
 6        private void SetSourceInfo(object sender, EventArgs e)
 7        {
 8            if (SetInfo!= null) { SetInfo(sender, e); }
 9        }
10        //或
11        //定义委托
12        public dSetSourceInfo tt;
13        public delegate void dSetSourceInfo(string str);
14        //类A中执行的方法
15        private void SetSourceInfott(string str)
16        {
17            if (tt != null) { tt(str); }
18        }
19        public A() { }
20       
21       /**//// <summary>
22       /// 开始
23        /// </summary>
24        public void Start() 
25        {
26            //委托使用
27            //SetSourceInfott("哈哈哈");
28            //Thread.Sleep(1000);
29            //SetSourceInfott("哈哈哈1");
30            //Thread.Sleep(1000);
31            //SetSourceInfott("哈哈哈2");
32            
33            //事件使用
34              SetSourceInfo("哈哈哈",null);
35            Thread.Sleep(1000);
36            SetSourceInfo("哈哈哈1",null);
37            Thread.Sleep(1000);
38            SetSourceInfo("哈哈哈2",null);
39        }
40     }

以上为一些简单的应用,其它复杂的基本上都可以按照这一招来做.

转载于:https://www.cnblogs.com/Mars_Chen/archive/2009/10/10/1580299.html

C#类中操作UI层控件状态[原]相关推荐

  1. springboot 项目中在普通类中调用dao层的mapper 出现空指针异常

    springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 参考文章: (1)springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 (2)https: ...

  2. android 异步回调中操作UI线程,UI同步、卡死阻塞等性能问题

    android开发中,回调无处不在,整个android开发的框架就是以回调机制建立起来的.如:activity,service,broadcast,fragment,view事件监听,baseadap ...

  3. SpringBoot在自定义类中调用service层等Spring其他层

    解决方案: 1.上代码@Component public class ServerHandler extends IoHandlerAdapter {@Autowiredprotected Healt ...

  4. QT开发之调用其它类中的UI控件的方法

    比如类A和类B, 在B中有一个QTreeWidget控件,需要在A中调用操作 先在A中声明一个 QTreeWidget *tree; 然后在B中声明一个类A的指针 A *a; a->tree = ...

  5. android 不能在子线程中更新ui的讨论和分析

    问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...

  6. android操作ui线程

    runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "网络 ...

  7. Android开发:操作UI线程4种方法

    我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据.但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的.下面总结4 ...

  8. redis工具类_SpringBoot 操作 Redis 数据

    SpringBoot 操作 Redis 数据 简介 Redis 是一个开源的NoSQL数据库,基于内存的键值存储,速度快.Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集. 5种 ...

  9. 在.NET中操作XmlDocument,XmlReader的方法

    用XmlDocument进行读取 大家想必一定都了解XML,利用XML技术来存储数据和文档是一件很容易的事情,.NET Framework 在它的命名空间System.Xml 就提供了一种可以很方便的 ...

最新文章

  1. 问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7
  2. python官方书籍-有哪些Python入门的书籍值得推荐?
  3. [数据结构] 散列表(哈希表)
  4. windows sybase bit显示勾_micro:bit怎么玩?只需5个简单步骤,光速上手
  5. 【C++】38.类成员变量声明为 对象与指针的区别
  6. ospf 环回口的路由条目_OSPF的LSA类型
  7. jsfl 改变舞台宽高
  8. flume1.8 开发指南学习感悟
  9. 怎么实现注解_通透!一口气搞懂注解到底怎么用
  10. DIV+CSS布局 - 弹性盒子布局
  11. 【Kilav】数据库知识点速通 其二
  12. java 发送封包_【Java学习笔记】自动封包和解包(Autoboxing和AutoUnboxing)
  13. elasticsearch 配置 之 discovery.zen.ping.unicast.hosts
  14. 封装获取非行内样式函数
  15. spring-cloud-context源码解读
  16. 进销存仓库管理系统:规范数据、流程与管理
  17. C++课本的练习题及答案(第五章)
  18. 人工智能大作业——五子棋
  19. 成为zabbix合作伙伴费用及意义
  20. erp系统选型需满足哪些条件?一位erp选型专家分享经验

热门文章

  1. PHPStudy下Apache SSL证书安装教程
  2. linux常用命令之lsof 、netstat、ipcs、ldd
  3. c#+ArcGIS Engine-获取矢量图层的空间参考
  4. PHP 一键安装扩展的程序-(Windows 系统)
  5. excel随机数的获取
  6. Linux的经常使用命令(1) - 指定执行级别
  7. linux下防火墙iptables原理及使用
  8. 关于bat中使用rar压缩命令
  9. C#中 .resx文件
  10. MSMQ消息队列演示程序