码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-02 22:28:21      阅读:348      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/PowersLi/p/4617133.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!