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