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 Demo0004 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //线程开始的时候调用的委托 private delegate void maxValueDelegate(int maxValue); //线程执行中调用的委托 private delegate void nowValueDelegate(int nowValue); private void button1_Click(object sender, EventArgs e) { ThreadMethod method = new ThreadMethod(); //先订阅一下事件 method.threadStartEvent += new EventHandler(method_threadStartEvent); method.threadEvent += new EventHandler(method_threadEvent); method.threadEndEvent += new EventHandler(method_threadEndEvent); Thread thread = new Thread(new ThreadStart(method.runMethod)); thread.Start(); } /// <summary> /// 线程开始事件,设置进度条最大值 /// 但是我不能直接操作进度条,需要一个委托来替我完成 /// </summary> /// <param name="sender">ThreadMethod函数中传过来的最大值</param> /// <param name="e"></param> void method_threadStartEvent(object sender, EventArgs e) { int maxValue = Convert.ToInt32(sender); maxValueDelegate max = new maxValueDelegate(setMax); this.Invoke(max, maxValue); } /// <summary> /// 线程执行中的事件,设置进度条当前进度 /// 但是我不能直接操作进度条,需要一个委托来替我完成 /// </summary> /// <param name="sender">ThreadMethod函数中传过来的当前值</param> /// <param name="e"></param> void method_threadEvent(object sender, EventArgs e) { int nowValue = Convert.ToInt32(sender); nowValueDelegate now = new nowValueDelegate(setNow); this.Invoke(now, nowValue); } /// <summary> /// 线程完成事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void method_threadEndEvent(object sender, EventArgs e) { MessageBox.Show("执行已经完成!"); } /// <summary> /// 我被委托调用,专门设置进度条最大值的 /// </summary> /// <param name="maxValue"></param> private void setMax(int maxValue) { this.progressBar1.Maximum = maxValue; } /// <summary> /// 我被委托调用,专门设置进度条当前值的 /// </summary> /// <param name="nowValue"></param> private void setNow(int nowValue) { this.progressBar1.Value = nowValue; } } public class ThreadMethod { /// <summary> /// 线程开始事件 /// </summary> public event EventHandler threadStartEvent; /// <summary> /// 线程执行时事件 /// </summary> public event EventHandler threadEvent; /// <summary> /// 线程结束事件 /// </summary> public event EventHandler threadEndEvent; public void runMethod() { int count = 100; //执行多少次 threadStartEvent.Invoke(count, new EventArgs());//通知主界面,我开始了,count用来设置进度条的最大值 for (int i = 0; i < count; i++) { Thread.Sleep(100);//休息100毫秒,模拟执行大数据量操作 threadEvent.Invoke(i, new EventArgs());//通知主界面我正在执行,i表示进度条当前进度 } threadEndEvent.Invoke(new object(), new EventArgs());//通知主界面我已经完成了 } } }
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 Demo0004 { public partial class Form2 : Form { //在下载窗体上面 建一个委托 public delegate void ChangeProgress(int value); //进度条 public delegate void ChangeButton(int value); //按钮 //创建上面的委托的变量 public ChangeProgress changeProgerss; public ChangeButton changebtn; public Form2() { InitializeComponent(); //为这个委托变量赋值 changeProgerss = FunChangeProgress; changebtn = FunChangebutton; } //通过创建工作线程消除用户界面线程的阻塞问题 private void button1_Click(object sender, EventArgs e) { button1.Enabled = false; //新创建一个线程 System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download)); thr.Start(); } //线程方法 一定要是object 类型参数 同时返回值是void private void Download(object obj) { for (int i = 0; i <= 100; i++) { //执行委托 更新按钮 -重点 this.button1.Invoke(changebtn, i); //执行委托 更新进度条 -重点 this.progressBar1.Invoke(changeProgerss, i); System.Threading.Thread.Sleep(100); } } //更新进度条 public void FunChangeProgress(int value) { progressBar1.Value = value; } //更新按钮 public void FunChangebutton(int value) { if (value == 100) { button1.Text = "开始新进程"; button1.Enabled = true; } else { //相除保留两位小数 且四舍五入 Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero) button1.Text = Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero) * 100 + "%"; } } //窗体关闭 强制退出 销毁所有相关进程 private void Form2_FormClosing(object sender, FormClosingEventArgs e) { //强制退出 销毁进程 System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close(); } } }
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; namespace Demo0004 { public partial class Form3 : Form { public delegate void ChangeStatus(); //创建上面的委托的变量 public ChangeStatus changestatus; public Form3() { InitializeComponent(); } private void Form3_Load(object sender, EventArgs e) { //使用Timer组件实现多线程定时同步 System.Timers.Timer t = new System.Timers.Timer(3000); //实例化Timer类,设置间隔时间单位毫秒; t.Elapsed += new System.Timers.ElapsedEventHandler(UpdateWork); //到达时间的时候执行事件; t.AutoReset = true; //设置是执行一次(false)还是一直执行(true); t.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件; changestatus = FunChangeStatus; } private void UpdateWork(object source, System.Timers.ElapsedEventArgs e) { this.Invoke(changestatus); } //更新 public void FunChangeStatus() { #region 更新开始 //更新方法 #endregion lbtimer.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 数据更新成功"; } } }