当前位置: 代码迷 >> C# >> C#在工作线程刷新主界面控件状态总结,单例模式、委托
  详细解决方案

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

热度:47   发布时间:2016-05-05 03:18:49.0
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 : 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、本小结在实现刷新主界面控件的时候结合使用了单例模式,不使用单例模式也完全可以实现,加上单例是为了让调用更加方便,在大项目开发中就会体现其优势。

 

  相关解决方案