一个通过BackgroundWorker实现WinForm异步操作的例子
一、场景描述
二、代码实现
1: private static int MaxRecords = 100;
1: private void buttonStartLeft_Click(object sender, EventArgs e)
2: {
3: if (this.backgroundWorkerLeft.IsBusy)
4: {
5: return;
6: }
7: this.listBoxLeft.Items.Clear();
8: this.backgroundWorkerLeft.RunWorkerAsync(MaxRecords);
9: this.buttonStartLeft.Enabled = false;
10: this.buttonCacnelLeft.Enabled = true;
11: }
1: private void backgroundWorkerLeft_DoWork(object sender, DoWorkEventArgs e)
2: {
3: try
4: {
5: e.Result = this.RetrieveData(this.backgroundWorkerLeft, e);
6: }
7: catch (Exception ex)
8: {
9: MessageBox.Show(ex.Message);
10: throw;
11: }
12: }
1: private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e)
2: {
3: int maxRecords = (int)e.Argument;
4: int percent = 0;
5: for (int i = 1; i <= maxRecords; i++)
6: {
7: if (worker.CancellationPending)
8: {
9: return i;
10: }
11:
12: percent = (int)(((double)i / (double)maxRecords) * 100);
13: worker.ReportProgress(percent, new KeyValuePair<int,string>(i,Guid.NewGuid().ToString()));
14: Thread.Sleep(100);
15: }
16:
17: return maxRecords;
18: }
1: private void backgroundWorkerLeft_ProgressChanged(object sender, ProgressChangedEventArgs e)
2: {
3: KeyValuePair<int,string> record = (KeyValuePair<int,string>) e.UserState ;
4: this.labelResultLeft.Text = string.Format("There are {0} records retrieved!", record.Key);
5: this.progressBarLeft.Value = e.ProgressPercentage;
6: this.listBoxLeft.Items.Add(record.Value);
7: }
1: private void buttonCacnelLeft_Click(object sender, EventArgs e)
2: {
3: this.backgroundWorkerLeft.CancelAsync();
4: }
1: private void backgroundWorkerLeft_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
2: {
3: try
4: {
5: this.labelResultLeft.Text = string.Format("Total records: {0}", e.Result);
6: this.buttonStartLeft.Enabled = true;
7: this.buttonCacnelLeft.Enabled = false;
8: }
9: catch (TargetInvocationException ex)
10: {
11: MessageBox.Show(ex.InnerException.GetType().ToString());
12: }
13: }
作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及着作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及着作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
最后更新:2017-10-30 17:04:45