c# 后台程序
C# 中的backgroundworker,是我个人认为最具有吸引力的windows标准控件之一,他允许程序在后台运行一个独立的线程,而不影响前台主窗口。这种进程控制在操作数据库或通讯时非常实用,因为后台线程在工作时并不影响前台的任何操作。如果不使用backgroundworker而简单的应用单一线程操作,则通讯时很有可能会造成主窗口假死,知道通讯结束后才会恢复。下面简单介绍了backgroundworker的用法:
有一点需要注意,backgroundworker不能直接操作前台windows窗口中的控件,否则会引起线程的不安全。
#region ( worker 1 )
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = NormalTest(backgroundWorker1, e);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressBar1.Value = e.ProgressPercentage;
Label1.Text = ProgressBar1.Value.ToString() + "%";
Label1.BackColor = Color.Orange;
Label1.ForeColor = Color.White;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (position == 0)
{
Label1.BackColor = Color.Green;
Button_Run1.Enabled = true;
Button_Pause1.Enabled = false;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = false;
}
}
#endregion
private void Button_Run1_Click(object sender, EventArgs e)
{
position = 0;
backgroundWorker1.RunWorkerAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = true;
}
private void Button_Pause1_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = true;
Button_Stop1.Enabled = true;
}
private void Button_Resume1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = true;
}
private void Button_Stop1_Click(object sender, EventArgs e)
{
position = 0;
backgroundWorker1.CancelAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = true;
}
private int NormalTest(BackgroundWorker work, DoWorkEventArgs e)
{
#region [ Pause Testing ]
if (work.CancellationPending)
{
return position;
}
#endregion
for (int i = position; i < nop; i++)
{
#region [ Pause Testing ]
if (work.CancellationPending)
{
return position;
}
#endregion
..
position = i;
work.ReportProgress((position + 1) * 100 / nop);
}
position = 0;
return position;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = NormalTest(backgroundWorker1, e);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressBar1.Value = e.ProgressPercentage;
Label1.Text = ProgressBar1.Value.ToString() + "%";
Label1.BackColor = Color.Orange;
Label1.ForeColor = Color.White;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (position == 0)
{
Label1.BackColor = Color.Green;
Button_Run1.Enabled = true;
Button_Pause1.Enabled = false;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = false;
}
}
#endregion
private void Button_Run1_Click(object sender, EventArgs e)
{
position = 0;
backgroundWorker1.RunWorkerAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = true;
}
private void Button_Pause1_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = true;
Button_Stop1.Enabled = true;
}
private void Button_Resume1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = true;
}
private void Button_Stop1_Click(object sender, EventArgs e)
{
position = 0;
backgroundWorker1.CancelAsync();
Button_Run1.Enabled = false;
Button_Pause1.Enabled = true;
Button_Resume1.Enabled = false;
Button_Stop1.Enabled = true;
}
private int NormalTest(BackgroundWorker work, DoWorkEventArgs e)
{
#region [ Pause Testing ]
if (work.CancellationPending)
{
return position;
}
#endregion
for (int i = position; i < nop; i++)
{
#region [ Pause Testing ]
if (work.CancellationPending)
{
return position;
}
#endregion
..
position = i;
work.ReportProgress((position + 1) * 100 / nop);
}
position = 0;
return position;
}
有一点需要注意,backgroundworker不能直接操作前台windows窗口中的控件,否则会引起线程的不安全。
浙公网安备 33010602011771号