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 }


 

窗體擺幾個控件就可以了

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM