A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庭院深深深几许 金牌黑马   /  2019-4-17 13:50  /  1283 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、添加控件
backgroundWorker1           组件
label1、label2                    用于显示过程和结果信息
progressBar1                     显示后台处理进度
button1                              用于取消后台操作

2、详细代码


  • using System;


  • using System.Collections.Generic;


  • using System.ComponentModel;


  • using System.Data;


  • using System.Drawing;


  • using System.Linq;


  • using System.Text;


  • using System.Threading.Tasks;


  • using System.Windows.Forms;


  • using System.Reflection;


  • using System.Threading;


  • namespace DemoCSDN


  • {


  •     public partial class Form1 : Form


  •     {


  •         public Form1()


  •         {


  •             InitializeComponent();


  •             progressBar1.Maximum = 100;


  •             backgroundWorker1.RunWorkerAsync(100);//调用RunWorkerAsync方法启动计算过程,其实这个方法可以接受一个 object 类型的参数。通过它我们就可以把任何数据传递给计算过程


  •             backgroundWorker1.WorkerReportsProgress = true;//允许我们在执行计算的过程中给UI线程发送消息


  •             backgroundWorker1.WorkerSupportsCancellation = true;//支持用户取消操作


  •         }


  •         //执行计算的过程中给UI线程发送消息


  •         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)


  •         {


  •             //修改进度条的显示。


  •             progressBar1.Value = e.ProgressPercentage;


  •             //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。


  •             //这是一个 object 类型的对象,您可以通过它传递任何类型。


  •             //我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。


  •             string message = e.UserState.ToString();


  •             label1.Text = message;


  •         }


  •         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)


  •         {


  •             BackgroundWorker bgWorker = sender as BackgroundWorker;


  •             int endNumber = 0;


  •             if (e.Argument != null)


  •             {


  •                 endNumber = (int)e.Argument;


  •             }


  •             int sum = 0;


  •             for (int i = 0; i <= endNumber; i++)


  •             {


  •                 sum += i;


  •                 string message = "Current sum is: " + sum.ToString();


  •                 //ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。


  •                 //第一个参数类型为 int,表示执行进度。


  •                 //如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。


  •                 //这里我们给第二个参数传进去一条消息。


  •                 bgWorker.ReportProgress(i, message);


  •                 Thread.Sleep(100);


  •                 //在操作的过程中需要检查用户是否取消了当前的操作。


  •                 if (bgWorker.CancellationPending == true)


  •                 {


  •                     e.Cancel = true;


  •                     break;


  •                 }


  •             }


  •             //如果想要拿到 e.Result,您需要在DoWork方法中设置 e.Result属性


  •             e.Result = sum;


  •         }


  •         //如果检测到用户点击的取消按钮,就退出当前的计算过程。下面是点击取消按钮时要调用的代码:


  •         private void button1_Click(object sender, EventArgs e)


  •         {


  •             backgroundWorker1.CancelAsync();


  •         }


  •         /*如果在计算过程中发生了异常该怎么处理?有没有办法知道计算过程已经结束?当然要有,即便是正常的结束也需要拿到计算的结果。


  •          *通过这个事件我们可以进行一些运算结束后的操作,比如禁用取消按钮,异常处理,结果显示等。*/


  •         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)


  •         {


  •             //如果用户取消了当前操作就关闭窗口。


  •             if (e.Cancelled)


  •             {


  •                 this.Close();


  •             }


  •             //计算已经结束,需要禁用取消按钮。


  •             this.button1.Enabled = false;


  •             //计算过程中的异常会被抓住,在这里可以进行处理。


  •             if (e.Error != null)


  •             {


  •                 Type errorType = e.Error.GetType();


  •                 switch (errorType.Name)


  •                 {


  •                     case "ArgumentNullException":


  •                     case "MyException":


  •                         //do something.


  •                         break;


  •                     default:


  •                         //do something.


  •                         break;


  •                 }


  •             }


  •             //计算结果信息:e.Result


  •             //use it do something.


  •             label2.Text = "完成 sum:" + e.Result.ToString();


  •         }


  •     }


  • }
3、界面显示

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马