标签:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication3 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } /// <summary> /// 因为控件的Invoke方法需要接收委托变量,因此需要定义委托和委托变量 /// 定义一个委托,接收一个参数 /// </summary> /// <param name="msg"></param> public delegate void DelegateFun(string msg); /// <summary> /// 定义一个委托变量 /// 这个委托变量,需要初始化指定具体的方法;然后传递给控件的Invoke方法调用。 /// </summary> public DelegateFun Fun1; /// <summary> /// 定义一个线程,处理数据,并更新界面 /// </summary> private Thread t = null; // 开始按钮 private void button1_Click(object sender, EventArgs e) { this.Invoke(Fun1, "开始..."); // 增加判断,避免每次单击都开辟一个线程 if (t == null) { t = new Thread(Run); t.Start(); } if (t.ThreadState == ThreadState.Suspended) // 如果被挂起了,就唤醒 { t.Resume(); } } // 结束执行 private void button2_Click(object sender, EventArgs e) { t.Suspend(); // 停止,挂起线程 this.Invoke(Fun1, "...停止"); } // 具体做事情的方法 public void Run() { //...... 处理一些事情,然后输出日志 int i = 0; while (true) { i++; // this指Form2 //Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。 //Invoke的参数是一个委托类型,因此必须定义委托变量 this.Invoke(Fun1, i.ToString()); } } //在form初始化的时候,给委托变量赋值具体的方法 private void Form2_Load(object sender, EventArgs e) { //给委托变量初始化具体的执行方法 Fun1 = Print; } // 输出日志的方法 public void Print(string msg) { // 新开辟的线程,不能直接调用这个方法。原因是控件只能由创建它的线程调用。 // 其他线程调用提示错误: 线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它。 this.richTextBox1.AppendText(msg + "\r\n"); this.richTextBox1.ScrollToCaret(); } } }
多线程、委托、Invoke解决winform界面卡死的问题,并带开关
标签:
原文地址:http://www.cnblogs.com/wang7/p/5869399.html