C# WinForm程序处理后台繁忙导致前台控件出现假死状态 返回后台处理事件的返回值,并在winform前台显示

  在项目中,我们经常会遇到窗体内要处理耗时较长的任务,窗体出现假死的问题,网上有很多解决办法。但是我们通常会遇到将耗时较长的运行结果展示在前台界面,所以就需要在原来的基础上进行修改。

 

  示例代码如下:

 1  public delegate string ChangeLabelValueEventHandler(object sender, Form1.AsyncEventArgs e);
 2 
 3     public partial class Form1 : Form
 4     {
 5         public Form1()
 6         {
 7             InitializeComponent();
 8         }
 9 
10         /// <summary>
11         /// 继承EventArgs类
12         /// </summary>
13         public class AsyncEventArgs : EventArgs
14         {
15             private string labelValue;
16 
17             public string LabelValue
18             {
19                 get { return labelValue; }
20             }
21 
22             public AsyncEventArgs(string paras)
23             {
24                 this.labelValue = paras;
25             }
26         }
27 
28         private void button1_Click(object sender, EventArgs e)
29         {
30             //创建新线程
31             Thread thread = new Thread(new ThreadStart(ChangeValueControl));
32             thread.Start();
33         }
34 
35 
36         private void ChangeValueControl()
37         {
38             if (this.label1.InvokeRequired)
39             {
40                 //委托注册事件 
41                 ChangeLabelValueEventHandler method = OnValueChanged;
42 
43                 //发生了妙不可言、消耗时间的事情 
44                 string flagString = HappendHappyThingsSpendHours().ToString();
45 
46                 AsyncEventArgs asyncEventArgs = new AsyncEventArgs(flagString);
47                 this.Invoke(method, this, asyncEventArgs).ToString();
48             }
49             else
50             {
51                 this.label1.Text = "false";
52             }
53         }
54 
55         private bool HappendHappyThingsSpendHours()
56         {
57             try
58             {
59                 //模拟事件
60                 for (int i = 0; i < int.MaxValue; i++)
61                 {
62 
63                 }
64                 return true;
65             }
66             catch (Exception e)
67             {
68                 return false;
69             }
70         }
71 
72 
73         private string OnValueChanged(object sender, Form1.AsyncEventArgs e)
74         {
75             this.label1.Text = e.LabelValue;
76             return "OnValueChanged  success";
77         }
78     }

 这段流程代码最主要的就是,委托通过this.Invoke(method, this, asyncEventArgs).ToString();去修改窗体上控件的值。


当然这里也可以用异步来处理。

 string flagString = HappendHappyThingsSpendHours().ToString();
 AsyncEventArgs asyncEventArgs = new AsyncEventArgs(flagString);
 ChangeLabelValueEventHandler changeLabelValueEventHandler = OnValueChanged;
 this.button1.BeginInvoke(changeLabelValueEventHandler, this, asyncEventArgs);

万变不离其宗。希望我们都可以沉迷于学习,无法自拔。

 

posted @ 2017-07-27 00:15  FAB4  阅读(476)  评论(0)    收藏  举报