private BackgroundWorker backgroundWorker5;
private delegate void delegateShowResultController(Label lbl, int setValue);
public BackgroundWorkerT()
{
InitializeComponent();
backgroundWorker5 = new BackgroundWorker();
backgroundWorker5.WorkerReportsProgress = true;
backgroundWorker5.WorkerSupportsCancellation = true;
backgroundWorker5.DoWork += new DoWorkEventHandler(backgroundWorker5_DoWork);
backgroundWorker5.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker5_ProgressChanged);
backgroundWorker5.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker5_RunWorkerCompleted);
}
private void backgroundWorker5_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
string arg = (string)e.Argument; //接收帶入的參數
label1.Text = arg;
e.Result = ExeJob(bw,e); //真正執行要做的動作
if (bw.CancellationPending)
{
e.Cancel = true;
}
}
private int ExeJob(BackgroundWorker bw,DoWorkEventArgs e)
{
int result = 0;
int exeTimes = 2000000;
for (int i = 0; i < exeTimes; i++)
{
int precent = ((i + 1) * 100) / exeTimes;
result = precent;
backgroundWorker5.ReportProgress(precent);
if (bw.CancellationPending)
{
e.Cancel = true; //Form1 觸發中斷執行
break;
}
}
return result;
}
private void backgroundWorker5_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker5_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("作業已取消");
}
else if (e.Error != null)
{
string msg = String.Format("發生錯誤 {0}", e.Error.Message);
MessageBox.Show(msg);
}
else
{
string msg = String.Format("執行結果 = {0}", e.Result);
MessageBox.Show(msg);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (backgroundWorker5.IsBusy != true)
{
this.backgroundWorker5.RunWorkerAsync("PROCESS1");
}
}
private void button2_Click(object sender, EventArgs e)
{
this.backgroundWorker5.CancelAsync();
}
private void button3_Click(object sender, EventArgs e)
{
for (int i = 0; i < 3000; i++)
{
//label1.Text = "Processing: " + i.ToString();
//System.Threading.Thread.Sleep(1000);
//Application.DoEvents();
object[] viewParams = new object[2];
viewParams[0] = label1;
viewParams[1] = i;
this.BeginInvoke(new delegateShowResultController(ShowResultView), viewParams);
}
label1.Text = "Finish";
}
private void ShowResultView(Label lbl, int setValue)
{
lbl.Text = setValue.ToString();
this.Refresh();
}
private delegate void delegateShowResultController(Label lbl, int setValue);
public BackgroundWorkerT()
{
InitializeComponent();
backgroundWorker5 = new BackgroundWorker();
backgroundWorker5.WorkerReportsProgress = true;
backgroundWorker5.WorkerSupportsCancellation = true;
backgroundWorker5.DoWork += new DoWorkEventHandler(backgroundWorker5_DoWork);
backgroundWorker5.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker5_ProgressChanged);
backgroundWorker5.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker5_RunWorkerCompleted);
}
private void backgroundWorker5_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
string arg = (string)e.Argument; //接收帶入的參數
label1.Text = arg;
e.Result = ExeJob(bw,e); //真正執行要做的動作
if (bw.CancellationPending)
{
e.Cancel = true;
}
}
private int ExeJob(BackgroundWorker bw,DoWorkEventArgs e)
{
int result = 0;
int exeTimes = 2000000;
for (int i = 0; i < exeTimes; i++)
{
int precent = ((i + 1) * 100) / exeTimes;
result = precent;
backgroundWorker5.ReportProgress(precent);
if (bw.CancellationPending)
{
e.Cancel = true; //Form1 觸發中斷執行
break;
}
}
return result;
}
private void backgroundWorker5_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker5_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("作業已取消");
}
else if (e.Error != null)
{
string msg = String.Format("發生錯誤 {0}", e.Error.Message);
MessageBox.Show(msg);
}
else
{
string msg = String.Format("執行結果 = {0}", e.Result);
MessageBox.Show(msg);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (backgroundWorker5.IsBusy != true)
{
this.backgroundWorker5.RunWorkerAsync("PROCESS1");
}
}
private void button2_Click(object sender, EventArgs e)
{
this.backgroundWorker5.CancelAsync();
}
private void button3_Click(object sender, EventArgs e)
{
for (int i = 0; i < 3000; i++)
{
//label1.Text = "Processing: " + i.ToString();
//System.Threading.Thread.Sleep(1000);
//Application.DoEvents();
object[] viewParams = new object[2];
viewParams[0] = label1;
viewParams[1] = i;
this.BeginInvoke(new delegateShowResultController(ShowResultView), viewParams);
}
label1.Text = "Finish";
}
private void ShowResultView(Label lbl, int setValue)
{
lbl.Text = setValue.ToString();
this.Refresh();
}