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 XXXX
11 {
12     public partial class BackGroundWorker : Form
13     {
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 = 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 }

窗体摆几个控件就可以了

时间: 2024-10-07 05:31:22

C# BackGroundWorker实现窗体不卡死 进度条功能的相关文章

winform 加载窗体时弹出另一个窗体并显示进度条的源码

winform 加载窗体时弹出另一个窗体并显示进度条的源码 //frmA: 源窗体 //------------------------------------------ //引用 using System.Threading; BackgroundWorker worker; public frmA() { InitializeComponent(); worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandl

js 实现进度条功能。

/** * 纯js进度条 * Created by kiner on 15/3/22. */ function progress(options){ this.w = (options && options.width)?parseFloat(options.width) : parseFloat(this.options.width); this.h = (options && options.height)?parseFloat(options.height) : pa

python基础学习日志day8-实现进度条功能,for和yield实现

实现进度条功能 方法一:简单FOR实现打印进度条功能 for i in range(10): print("#",end="",flush=True) time.sleep(0.4) #方法二,yeild实现复杂进度条功能 def show_process(total): recive_size=0 current_size=0 while recive_size<total: if int(recive_size/total*100) >current

.Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能

.Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能 我的项目需求是:在.net4.5中用mvc5实现上传xml文件,后台实时导入数据库时传到前台进度,进度条实现动态在走. 网上看了很多实现此需求的方法(服务器轮训向客户端发送消息)ajax.webscoket.singal等. 之前的代码是前段用定时器ajax去访问后台的进度数据.然后给进度条赋值.发现有时候ajax请求总出现pending的状态. 之前的缓存实现代码: var cc=true;

用Struts2实现文件上传时显示进度条功能

最近在做一个资源共享的项目中,采用了Struts2.1.8+Spring2.5.6+hibernate3.32的框架整合方式进行开发.在文件上传这块,因为需要实现文件上传时显示进度条的功能,所以尝试了一下.怕以后忘记,先贴出来分享下.   要在上传文件时能显示进度条,首先需要实时的获知web服务端接收了多少字节,以及文件总大小,这里我们在页面上使用AJAX技术每一秒向服务器发送一次请求来获得需要的实时上传信息.但是当我们使用struts2后怎么在服务端获得实时的上传大小呢?这里需要用到commo

微信小程序 - 时间进度条功能

关于答题类,或者一些游戏环节的小程序需要用到时间进度条,改功能怎么实现看下面源码 <view class='out' style='margin-top:10px'> <view class='in' style='width:{{progressWidth}}%'></view> </view> <view class='caozuo'> <text>{{progressTime}}秒</text> <text b

HTML5+CSS+JQuery 实现简单的进度条功能

样式: <style type="text/css"> .processcontainer2{ width:450px; border:1px solid #6C9C2C; height:25px; border-radius: 10px; box-shadow: 5px 10px 20px lightgray; } #processbar2{ background:green; float:left; height:100%; text-align:center; lin

进度条功能的实现

1.HTML写法 //进度条样式隐藏 <div id="jindu" style="position:absolute;z-index:55;border:0px red solid;width:89%;height:75%;margin:10% 0 0 5%;background:rgb(0,51,102,0.6);float:left;display:none;"> <div id="wai"> <div id=

html5实现进度条功能效果非常和谐

1. [图片] html5.jpg ?2. [代码][HTML]代码  <script type="text/javascript">    var i = 0;    var res = 0;    var context = null;    var total_width = 300;    var total_height = 34;    var initial_x = 20;    var initial_y = 20;    var radius = tota