<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在我們的程式中,經常會有一些耗時較長的運算,為了保證使用者體驗,不引起介面不響應,我們一般會採用多執行緒操作,讓耗時操作在後臺完成,完成後再進行處理或給出提示,在執行中,也會時時去重新整理介面上的進度條等顯示,必要時還要控制後臺執行緒中斷當前操作。
在.net中,提供了一個元件BackgroundWorker就是專門解決這個問題的。BackgroundWorker類允許在單獨的專用執行緒上執行操作。 耗時的操作(如下載和資料庫事務)在長時間執行時可能會導致使用者介面(UI)似乎處於停止響應狀態。如果需要能進行響應的使用者介面,而且面臨與這類操作相關的長時間延遲,則可以使用BackgroundWorker類方便地解決問題。
為了顯示後臺操作的執行進度,首先要使WorkerReportsProgress等於true,然後呼叫BackgroundWorker的ReportProgress()方法,通過它傳遞操作完成的進度值,此外,該方法觸發ProgressChanged事件,在此事件中,通過ProgressChangedEventArgs的範例,接收到主執行緒傳遞過來的引數。
為了使 BackgroundWorker 可以取消後臺正在執行的操作,首先要把屬性WorkerSupportsCancellation 的值設定為 true。接著呼叫CancelAsync()方法,該方法使得屬性CancellationPending 為true,利用CancellationPending 屬性,可以判斷是否取消後臺非同步操作。
當後臺操作完成以後,無論是completed 還是cancelled,RunWorkerCompleted()事件都會被觸發,通過此方法可以將後臺操作的完成結果反饋給使用者。RunWorkerCompleted 事件處理常式會在DoWork 事件處理常式返回後被呼叫。通過它我們可以進行一些運算結束後的操作,比如禁用取消按鈕,例外處理,結果顯示等。注意,如果想要拿到e.Result,您需要在BGWorker_DoWork方法中設定 e.Result屬性另外,通過RunWorkerCompletedEventArgs範例的Cancelled 屬性,以判斷是否是Cancel操作使得後臺操作終止;
在執行DoWork事件時DoWorkEventArgs範例的Result屬性,返回值到使用者;在RunWorkerCompleted事件裡,RunWorkerCompletedEventArgs 範例的Result屬性接收值;
後臺程式碼:
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.IO; using System.Threading; namespace BackgroundWorkerDemo { public partial class FrmDemo : Form { //設定生成臨時檔案的路徑 static string strSaveDir = @"F:培訓"; public FrmDemo() { InitializeComponent(); //顯示後臺操作的執行進度 this.bgWork.WorkerReportsProgress = true; //可以取消後臺正在執行的操作 this.bgWork.WorkerSupportsCancellation = true; } /// <summary> /// 開始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Start_Click(object sender, EventArgs e) { if (Directory.Exists(strSaveDir) == false) { return; } btn_Start.Enabled = false; int count = Convert.ToInt32(this.txt_File.Text.ToString().Trim()); //設定進度條 this.proBar.Minimum = 0; this.proBar.Maximum = count; this.proBar.Value = this.proBar.Minimum; //開始執行非同步執行緒,進行後臺操作,給後臺傳遞引數 this.bgWork.RunWorkerAsync(count); } /// <summary> /// 後臺操作要處理的任務程式碼 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void bgWork_DoWork(object sender, DoWorkEventArgs e) { //獲取從RunWorkerAsync()方法裡面傳遞的引數的值 int fileCount= Convert.ToInt32(e.Argument); Random rand = new Random(); byte[] buffer = new byte[2048]; for (int i = 0; i < fileCount; i++) { try { string strFileName = Path.Combine(strSaveDir, i.ToString() + ".tmp"); using (var stream = File.Create(strFileName)) { int n = 0; int maxByte = 8 * 1024 * 1024; while (n < maxByte) { rand.NextBytes(buffer); stream.Write(buffer, 0, buffer.Length); n += buffer.Length; } } } catch (Exception ex) { continue; } finally { //報告進度 this.bgWork.ReportProgress(i + 1); Thread.Sleep(100); } //判斷是否取消了後臺操作 if (bgWork.CancellationPending) { e.Cancel = true; return; } //設定返回值 e.Result = 234; } } /// <summary> /// 更新前臺介面進度條 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e) { //獲取非同步任務的進度百分百 int val = e.ProgressPercentage; this.label2.Text = string.Format("已經生成{0}個檔案", val); //進度條顯示當前進度 this.proBar.Value = val; } /// <summary> /// 後臺操作完成,向前臺反饋資訊 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { btn_Start.Enabled = true; //使用者取消操作(e.Cancelled==true,表示非同步操作已被取消) if (e.Cancelled) { MessageBox.Show("使用者取消後臺操作", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("操作完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); //接收返回值 int result = (int)e.Result; MessageBox.Show("返回值:" + result); } } /// <summary> /// 取消 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Cancle_Click(object sender, EventArgs e) { //呼叫CancelAsync(),取消掛起的後臺操作 this.bgWork.CancelAsync(); } } }
執行介面:
操作完成介面:
接收返回值:
取消後臺操作:
到此這篇關於C#使用BackgroundWorker控制元件的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45