C#在工作线程刷新主界面控件状态小结,单例模式、委托

今日项目开发中需要在服务器界面实时显示客户端连接状态,使用C#的反射机制解决了问题。由于项目比较复杂,现结合一个小例子,对使用C#委托反射机制刷新主界面上的控件状态进行简单小结,希望对新手有所帮助。

一、新建一个C# winform工程:Form_MainUI,界面布局如图1。

代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9
10 using System.Threading;
11
12 namespace 更新主界面控件
13 {
14     public partial class Form_MainUI : Form
15     {
16         private delegate void InvokeListBox(string strCon);    // 刷新ListBox的委托。
17         private InvokeListBox invokeListBox;
18
19         private Work wk;    //工作线程对象
20
21         public Form_MainUI()
22         {
23             InitializeComponent();
24
25             wk = Work.GetInstance();    //单例模式初始化工作线程对象
26             wk.invokeOthers = new Work.InvokeListBox(ReciveData);    // 绑定,接收工作线程过来的数据
27             invokeListBox = new InvokeListBox(RefrushListBox);       // 绑定,刷新界面ListBox控件
28         }
29
30         /// <summary>
31         /// 启动工作线程
32         /// </summary>
33         /// <param name="sender"></param>
34         /// <param name="e"></param>
35         private void button_StartWork_Click(object sender, EventArgs e)
36         {
37             Thread th = new Thread(new ThreadStart(wk.DoSomething));
38             th.Start();
39         }
40
41         /// <summary>
42         /// 接收工作线程过来的数据,更新界面
43         /// </summary>
44         /// <param name="i"></param>
45         public void ReciveData(int i)
46         {
47             string strConten = i.ToString() + "  更新";
48
49             if (this.listBox_state.InvokeRequired)
50             {
51                 this.listBox_state.Invoke(invokeListBox, new object[] { strConten });
52             }
53         }
54
55         /// <summary>
56         /// 具体刷新界面函数
57         /// </summary>
58         /// <param name="_str"></param>
59         public void RefrushListBox(string _str)
60         {
61             this.listBox_state.Items.Add(_str);
62         }
63     }
64 }

二、添加一个工作线程类:Work,代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 using System.Threading;
 7
 8 namespace 更新主界面控件
 9 {
10     public class Work
11     {
12         private volatile static Work instanceWork;    // 单例
13
14         public delegate void InvokeListBox(int i);
15         public InvokeListBox invokeOthers;
16
17         /// <summary>
18         /// 构造函数
19         /// </summary>
20         public Work()
21         {
22
23         }
24
25         /// <summary>
26         /// 对外接口,获取单例
27         /// </summary>
28         /// <returns></returns>
29         public static Work GetInstance()
30         {
31             if (null == instanceWork)
32             {
33                 instanceWork = new Work();
34             }
35
36             return instanceWork;
37         }
38
39         /// <summary>
40         /// 业务函数,在工作过程中将状态传给主界面
41         /// </summary>
42         public void DoSomething()
43         {
44             for (int i = 0; i < 20; i++)
45             {
46                 Thread.Sleep(1000);
47                 invokeOthers(i);
48             }
49         }
50     }
51 }

三、运行结果:

功能后是点击“开始工作”按钮后,启动工作线程,修改主界面ListBox_State的内容。

说明:1、通过工作线程修改主界面其它控件的内容、状态、图片等操作类似。

2、本小结在实现刷新主界面控件的时候结合使用了单例模式,不使用单例模式也完全可以实现,加上单例是为了让调用更加方便,在大项目开发中就会体现其优势。

时间: 2024-08-06 11:58:29

C#在工作线程刷新主界面控件状态小结,单例模式、委托的相关文章

Android子线程刷新主线程中View

最近遇到一问题,ListView Item加载多个图片,图片是在Adapter的getView方法通过子线程异步进行加载的. 这时候就涉及到子线程刷新主线程中View的问题,一般有两个方式, 1.View.post(Runnable); 2.Activity.runOnUiThread(Runnable); 首次是使用View.post方式来刷新界面,但是一直刷新失败,debug发现图片下载已经成功,View.post方法也已经调用了,但是图片刷新一直没有成功. 很纳闷,于是加上log看了一下,

Android子线程更新主界面

学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler技术,闲话不多说了! 每一个做android的人都知道,android的内存可谓是存M存金啊!然后我们自然知道,而且Google在设计的时候也充分的考虑到了这一点,所以,我们的UIThread里面一般不做耗时的工作,比如请求网络,比如执行一些比较耗时的逻辑,比如比如加载图片,比如,哦,暂时只碰到过这

分布式缓存系统 Memcached 工作线程初始化

Memcached采用典型的Master-Worker模式,其核心思想是:有Master和Worker两类进程(线程)协同工作,Master进程负责接收和分配任务,Worker进程负责处理子任务.当各Worker进程将各个子任务处理完成后,将结果返回给Master进程,由Master进程做归纳和汇总. 工作示意图如下所示: 其中每个工作线程维护一个连接队列,以接收由主线程分配的客户连接:同时每个工作线程维护一个Libevent实例,以处理和主线程间的管道通信以及和客户连接间的socket通信事件

Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面: 即如何使用Thread+Handler的方式从非UI线程发送界面更新消息到UI线程. 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),

你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?

IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数” 这边客户请求的连接内容包括: 1.网站html请求,html中的图片资源,html中的脚本资源,其他需要连接下载的资源等等,任何一个资源的请求即一次连接(虽然有的资源请求连接响应很快) 2.如果网页采用框架(框架内部嵌套网页请求),那么一个框架即一次连接 3.如果网页弹出窗口(窗口内部嵌

Ext JS 6开发实例(三) :主界面设计

在上文中,已经将CMD创建的应用程序导入到项目里了,而且也看到默认的主界面了,今天的主要工作就是修改这个主界面,以符合项目的需要.除了设计主界面,还有一些其他的东西需要配置一下. 添加本地化包 打开app.json文件,找到requires,代码如下:     "requires": [      "font-awesome"     ],12341234 以上代码说明项目默认已经引用了Font Awesome的图标,可以在项目中直接使用.这个在项目的后续开发中会经

窗体和线程漫谈之工作线程怎样将数据的处理结果显示到窗体

前言 原本这篇博客的标题叫<窗体和线程漫谈>,但想来想去确实不太合适.由于我确实没有写关于窗体和线程的不论什么理论知识,而仅仅是探讨了工作线程怎样将数据的处理结果显示到窗体这个问题,因此又一次改动标题. 另外,关于窗体和线程的相关理论知识.感觉一两句话确实说不清楚,并且<Windows 核心编程>这本书上介绍的也挺好的.有机会再写吧.特别是感觉如今好多人都直接在学 MFC,用 MFC.甚至连窗体过程,消息循环都不太明确,假设能有这样一篇博客也是非常有价值的. 为什么要讨论这个问题

使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、播放列表)

前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment.ViewPager来搭建播放器的主界面,并实现本地播放基本功能.系列文章提供截图.代码说明.源码下载,欢迎交流! 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 系列 1.使用Vitamio打造自己的Android万能播放器(1)——准备 2.使用Vitam

IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的

IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫"IIS限制连接数" 这边客户请求的连接内容包括: 1.网站html请求,html中的图片资源,html中的脚本资源,其他需要连接下载的资源等等,任何一个资源的请求即一次连接(虽然有的资源请求连接响应很快) 2.如果网页采用框架(框架内部嵌套网页请求),那么一个框架即一次连接 3.如果网页弹出窗口(