C# 使用BackgroundWorker例子及注意點
該例子為使用BackgroundWorker在TextBox文本中產生一個10000以內并且能被5整除的數(shù)(1秒產生一個)
操作界面可以啟動線程,也可以停止線程,界面設計如圖:

先貼代碼,有注釋的地方就不解釋了。
先引入命名空間:using System.Threading; using System.Net;
整個Form1窗體代碼如下:
namespace BackgroundWorkerExample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
btn_Stop.Enabled = false;
}
private void btn_Start_Click(object sender, EventArgs e)
{
txt_Text.Text = "開始產生10000以內的隨機數(shù)……\n\n";
btn_Start.Enabled = false;
btn_Stop.Enabled = true;
//在后臺線程開始操作
backgroundWorker1.RunWorkerAsync();
}
private void btn_Stop_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
btn_Stop.Enabled = false;
btn_Start.Enabled = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//不要直接使用組件實例名稱(backgroundWorker1),因為有多個BackgroundWorker時,
//直接使用會產生耦合問題,應該通過下面的轉換使用它
BackgroundWorker worker = sender as BackgroundWorker;
//下面的內容相當于線程要處理的內容。//注意:不要在此事件中和界面控件打交道
Random r = new Random();
int numCount = 0;
while (worker.CancellationPending == false)
{
int num = r.Next(0, 10000);
if (num % 5 == 0)
{
numCount++;
worker.ReportProgress(0, num);
Thread.Sleep(1000);
}
}
e.Result = numCount;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int num = (int)e.UserState;
txt_Text.Text += num + " ";
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
txt_Text.Text += "\n\n操作停止,共生產" + e.Result + "個能被5整除的隨機數(shù)";
else
txt_Text.Text += "\n操作過程中產生錯誤:" + e.Error;
}
}
}
該例子在 Backgroundworker 組件的輔助線程上隨機產生整數(shù),輔助線程運行DoWork事件處理程序,當產生能被5整除的整數(shù)時,使用ProgressChanged事件把整數(shù)顯示到窗體上。程序執(zhí)行到 RunWorkerAsync 方法時,將啟動后臺線程。 在Dowork事件中,如果應用程序沒有取消后臺操作,將不停的產生隨機整數(shù),然后判斷該整數(shù)能否被5整除,如果能被5整除,執(zhí)行work.ReportProgress方法來觸發(fā) ProgressChanged 事件,在 ProgressChanged 事件中與界面長須打交道,把生產的隨機整數(shù)顯示到窗體上。
界面編譯后運行如圖:


浙公網安備 33010602011771號