利用VS2022製作一個有關 BackgroundWorker的範例進度條視窗 1. 首先建立Windows Forms應用程式 並建立兩個button 2. 新增一個TextBox 用來顯示進度訊息 3. 在左側工具列搜尋BackgroundWorker,並拖拉到from1底下 畫面如下  修改botton顯示名稱只要快按兩下,就會在右側的屬性列裡找到test修改名稱 在Form.cs裡的程式碼如下 ``` using System.ComponentModel; namespace BackgroundWorker_test { public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; } private void Form1_Load(object sender, EventArgs e) { backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged; backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; } private void BackgroundWorker1_ProgressChanged(object? sender, System.ComponentModel.ProgressChangedEventArgs e) { //throw new NotImplementedException(); progressBar1.Value = e.ProgressPercentage; } //Start按鈕 private void button1_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy == true) return; { backgroundWorker1.RunWorkerAsync(); } } //Cancel按鈕 private void button2_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation == false) return; { backgroundWorker1.CancelAsync(); } } private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; //模擬耗時很長的工作 for (int i = 0; i < progressBar1.Maximum; i++) { //判斷使用者是否中斷工作 if (worker.CancellationPending == true) { e.Cancel = true; //通知RunWorkerCompleted此工作被中斷 break; } //停止0.05秒,()裡放毫秒。1000毫秒=1秒 Thread.Sleep(50); //worker.ReportProgress(i*10); //跑動進度條 if (i % (progressBar1.Maximum / progressBar1.Step) == 0) { backgroundWorker1.ReportProgress(i); } } } private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { label1.Text = $"已完成進度:{e.ProgressPercentage}%"; } private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { /*不只用return來中斷工作,同時還修改了e.Cancel。 * 這是因為DoWorkEventArgs會把Cancel屬性傳遞給RunWorkerCompletedEventArgs */ //判斷使用者是否中斷工作 if (e.Cancelled == true) { label1.Text = "取消"; //backgroundWorker1.RunWorkerAsync(); //重啟工作 } else if (e.Error != null) { label1.Text = "錯誤訊息:" + e.Error.Message; } else { label1.Text = "完成"; } } private void label1_Click(object sender, EventArgs e) { } } } ``` 執行結果畫面如下  開啟停止都可以執行啦~~~ 此範例參考以下網站資訊: 1. https://learn.microsoft.com/zh-tw/dotnet/api/system.componentmodel.backgroundworker?view=net-7.0 1. https://yuchungchuang.wordpress.com/2018/07/22/c-%E5%A4%9A%E5%9F%B7%E8%A1%8C%E7%B7%921-backgroundworker/ 1. https://jengting.blogspot.com/2017/02/BackgroundWorker-Simple.html
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up