首页 > 代码库 > C# BackGroundWorker实现窗体不卡死 进度条功能
C# BackGroundWorker实现窗体不卡死 进度条功能
网上的例子少了好多属性的配置,改好了一个能直接用的:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace XXXX11 {12 public partial class BackGroundWorker : Form13 {14 public BackGroundWorker()15 {16 InitializeComponent();17 backgroundWorker1.WorkerReportsProgress = true;18 backgroundWorker1.WorkerSupportsCancellation = true;19 backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);20 backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);21 backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);22 progressBar1.Maximum = 10000;23 }24 25 //这里就是通过响应消息,来处理界面的显示工作26 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)27 {28 this.progressBar1.Value =http://www.mamicode.com/ e.ProgressPercentage;29 this.label1.Text = e.UserState.ToString();30 this.label1.Update();31 }32 33 //这里是后台工作完成后的消息处理,可以在这里进行后续的处理工作。34 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)35 {36 MessageBox.Show("运算终于完成了");37 }38 39 //这里,就是后台进程开始工作时,调用工作函数的地方。你可以把你现有的处理函数写在这儿。40 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)41 {42 work(this.backgroundWorker1);43 }44 45 //真正的处理工作46 private bool work(BackgroundWorker bk)47 {48 int tatle = 10001;49 50 for (int i = 0; i < tatle; i++)51 {52 if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。53 {54 bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));55 return false;56 }57 58 //处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。59 bk.ReportProgress(i, String.Format("当前值是 {0} ", i));60 }61 return true;62 }63 64 private void button2_Click(object sender, EventArgs e)65 {66 //用户要求取消时,就这样处理一下。有时不太灵喔。67 this.backgroundWorker1.CancelAsync();68 }69 70 private void button1_Click(object sender, EventArgs e)71 {72 if (this.backgroundWorker1.IsBusy)73 return;74 this.backgroundWorker1.RunWorkerAsync();75 }76 77 private void button3_Click(object sender, EventArgs e)78 {79 this.Close();80 }81 }82 }
窗体摆几个控件就可以了
C# BackGroundWorker实现窗体不卡死 进度条功能
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。