【原】C#子线程刷新主线程一例

要求:如下图,使用线程操作

1、实时显示当前时间

2、输入加数和被加数,自动出现结果

分析:两个问题解决的方式一致,使用子线程进行时间操作和加法操作,然后刷新主线程的控件显示结果

  1 using System;
  2 using System.Threading;
  3 using System.Windows.Forms;
  4 
  5 namespace WinThread
  6 {
  7     public partial class frmMain : Form
  8     {
  9         public frmMain()
 10         {
 11             InitializeComponent();
 12         }
 13 
 14         /// <summary>
 15         /// 初始化
 16         /// </summary>
 17         /// <param name="sender"></param>
 18         /// <param name="e"></param>
 19         private void frmMain_Load(object sender, EventArgs e)
 20         {
 21             // 控件初始化
 22             this.txtOne.Text = "0";
 23             this.txtSecond.Text = "0";
 24 
 25             // 显示时间操作
 26             Thread showTimeThread = new Thread(new ThreadStart(GetTime));
 27             showTimeThread.IsBackground = true;
 28             showTimeThread.Start();
 29 
 30             // 加法操作
 31             Thread addThread = new Thread(new ThreadStart(Add));
 32             addThread.IsBackground = true;
 33             addThread.Start();
 34         }
 35 
 36         #region 显示时间操作
 37 
 38         /// <summary>
 39         /// 取得实时时间
 40         /// </summary>
 41         private void GetTime()
 42         {
 43             try
 44             {
 45                 while (true)
 46                 {
 47                     string currentTime = string.Format("{0}.{1}", DateTime.Now.ToLongTimeString(), DateTime.Now.Millisecond);
 48 
 49                     ShowTime(currentTime);
 50 
 51                     Application.DoEvents();
 52                 }
 53             }
 54             catch (Exception ex)
 55             {
 56                 Console.WriteLine(ex.Message);
 57             }
 58         }
 59 
 60         // 定义显示时间操作委托,用于回调显示时间方法
 61         delegate void ShowTimeCallBack(string str);
 62 
 63         /// <summary>
 64         /// 实时显示时间
 65         /// </summary>
 66         /// <param name="str"></param>
 67         private void ShowTime(string str)
 68         {
 69             if (this.txtCurrentTime.InvokeRequired)
 70             {
 71                 ShowTimeCallBack showTimeCallBack = new ShowTimeCallBack(ShowTime);
 72                 this.Invoke(showTimeCallBack, new object[] { str });
 73             }
 74             else
 75             {
 76                 this.txtCurrentTime.Text = str;
 77             }
 78         }
 79 
 80         #endregion
 81 
 82         #region 加法操作
 83 
 84         /// <summary>
 85         /// 加法操作
 86         /// </summary>
 87         private void Add()
 88         {
 89             try
 90             {
 91                 while (true)
 92                 {
 93                     int i = Convert.ToInt32(this.txtOne.Text.Trim());
 94                     int j = Convert.ToInt32(this.txtSecond.Text.Trim());
 95 
 96                     ShowResult((i + j).ToString());
 97 
 98                     Application.DoEvents();
 99                 }
100             }
101             catch (Exception ex)
102             {
103                 Console.WriteLine(ex.Message);
104             }
105         }
106 
107         // 定义加法操作委托,用于回调加法操作方法
108         delegate void ShowResultCallBack(string result);
109 
110         /// <summary>
111         /// 显示结果
112         /// </summary>
113         /// <param name="result"></param>
114         private void ShowResult(string result)
115         {
116             if (this.txtResult.InvokeRequired)
117             {
118                 // 写法1
119                 //ShowResultCallBack showResultCallBack = new ShowResultCallBack(ShowResult);
120                 //this.Invoke(showResultCallBack, new object[] { result });
121                 
122                 // 写法2
123                 //使用委托来赋值
124                 this.txtResult.Invoke(
125                     //委托方法
126                     new ShowResultCallBack(ShowResult),
127                     new object[] { result });
128             }
129             else
130             {
131                 this.txtResult.Text = result;
132             }
133         }
134 
135         #endregion
136     }
137 }

是不是很简单呢?

 

posted @ 2012-11-22 08:44  {name:"代码屠夫"}  阅读(883)  评论(7编辑  收藏  举报