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);
万变不离其宗。希望我们都可以沉迷于学习,无法自拔。
浙公网安备 33010602011771号