private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
ThreadMethod method = new ThreadMethod();
//先訂閱一下事件
method.threadStartEvent += new EventHandler(method_threadStartEvent);
method.threadEvent += new EventHandler(method_threadEvent);
method.threadEndEvent += new EventHandler(method_threadEndEvent);
Task task = new Task(() => { method.runMethod(); });
task.Start();
}
/// <summary>
/// 線程開始事件,設置進度條最大值
/// 但是我不能直接操作進度條,需要一個委託來替我完成
/// </summary>
/// <param name="sender">ThreadMethod函數中傳過來的最大值</param>
/// <param name="e"></param>
void method_threadStartEvent(object sender, EventArgs e)
{
int maxValue = Convert.ToInt32(sender);
this.Invoke(new Action<int>(setMax), maxValue);
}
/// <summary>
/// 線程執行中的事件,設置進度條當前進度
/// 但是我不能直接操作進度條,需要一個委託來替我完成
/// </summary>
/// <param name="sender">ThreadMethod函數中傳過來的當前值</param>
/// <param name="e"></param>
void method_threadEvent(object sender, EventArgs e)
{
int nowValue = Convert.ToInt32(sender);
this.Invoke(new Action<int>(setNow), nowValue);
}
/// <summary>
/// 線程完成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void method_threadEndEvent(object sender, EventArgs e)
{
MessageBox.Show("執行已經完成!");
this.Invoke(new Action(setButton));
//只有入參用Action ,如果有返回值用FunC
}
public void setButton()
{
this.button1.Enabled = true;
}
/// <summary>
/// 我被委託調用,專門設置進度條最大值的
/// </summary>
/// <param name="maxValue"></param>
public 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());//通知主界面我已經完成了
}
}