BackGroundWorker
帮助使用者进行线程间的交互。具体的数据交流载体就是EventArgs e
这个参数。
BackgroundWorker _backgroundWorker = new BackgroundWorker();
public Form1()
{
InitializeComponent();
InitBackGroundWorker();
_backgroundWorker.WorkerReportsProgress = true;
_backgroundWorker.WorkerSupportsCancellation = true;
btnStop.Enabled = false;
}
private void InitBackGroundWorker()
{
_backgroundWorker.DoWork += BW_DoWork;
_backgroundWorker.ProgressChanged += BW_ProgressChanged;
_backgroundWorker.RunWorkerCompleted += BW_RunWorkerCompleted;
}
private void BW_DoWork(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
Random r = new Random();
int nCnt = 0;
while (worker.CancellationPending == false)
{
int num = r.Next(0, 10000);
if (num % 5 == 0)
{
nCnt++;
worker.ReportProgress(0, num);
Thread.Sleep(1000);
}
}
e.Result = nCnt;
}
private void BW_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int num = (int)e.UserState;
txtResult.Text += num + " ";
}
private void BW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
txtResult.Text += $"\r\n\r\n操作停止,共生产 {e.Result} 个能被5整除的随机数";
}
else
{
txtResult.Text += "\r\n\r\nn操作过程中产生错误:" + e.Error;
}
}
private void btnStart_Click(object sender, EventArgs e)
{
txtResult.Text = "开始产生10000以内的随机数......\r\n";
btnStart.Enabled = false;
btnStop.Enabled = true;
_backgroundWorker.RunWorkerAsync();
}
private void btnStop_Click(object sender, EventArgs e)
{
_backgroundWorker.CancelAsync();
btnStart.Enabled = true;
btnStop.Enabled = false;
}