标签:
今日项目开发中需要在服务器界面实时显示客户端连接状态,使用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、本小结在实现刷新主界面控件的时候结合使用了单例模式,不使用单例模式也完全可以实现,加上单例是为了让调用更加方便,在大项目开发中就会体现其优势。
标签:
原文地址:http://www.cnblogs.com/PowersLi/p/4617133.html