c#中使用BackgroundWorker的實(shí)現(xiàn)
在客戶端中,為了防止界面假死狀態(tài),或者不能拖動(dòng)界面,可以使用BackgroundWorker。
1.在界面上拖動(dòng)一個(gè)BackgroundWorker,label,進(jìn)度條和2個(gè)button控件。BackgroundWorker也可以選擇在cs文件中new。
2.bgWorker_DoWork事件中接收到bgWorker.RunWorkerAsync("11111")
3.bgWorker_ProgessChanged事件中接收到bgWorker.ReportProgress方法傳遞過來的參數(shù)
4.bgWorker_WorkerCompleted事件中主要處理線程暫?;蛘呓K止時(shí)的提示
5.中途取消操作后,也就是執(zhí)行bgWorker.CancelAsync()此方法。bgWorker.CancellationPending會(huì)變成true
所有代碼:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnStart_Click(object sender, EventArgs e) { if (bgWorker.IsBusy) //判斷是否正在運(yùn)行異步操作 return; this.progressBar1.Maximum = 100; //設(shè)置進(jìn)度條最大值 this.btnStart.Enabled = false; this.btnStop.Enabled = true; bgWorker.RunWorkerAsync("11111"); //給業(yè)務(wù)傳遞參數(shù),就是把前臺(tái)的要處理的參數(shù)傳遞進(jìn)去 } public void bgWorker_DoWork(object sender, DoWorkEventArgs e) { //業(yè)務(wù)處理 object s = e.Argument; //這的e.Argument就是上面?zhèn)鬟f的參數(shù) 11111 for (int i = 0; i <= this.progressBar1.Maximum; i++) { if (bgWorker.CancellationPending) //此處關(guān)聯(lián)的是btnStop_Click事件中的這個(gè)bgWorker.CancelAsync();如果這個(gè)觸發(fā)了,那么就會(huì)停止。 { e.Cancel = true; return; } else { bgWorker.ReportProgress(i, "222222"); //向bgWorker_ProgessChanged事件傳遞參數(shù),第一個(gè)是進(jìn)度的參數(shù),第二個(gè)是你要處理業(yè)務(wù)的參數(shù) System.Threading.Thread.Sleep(1); } } } public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e) { //頁面處理 string state = (string)e.UserState;//接收上bgWorker.ReportProgress方法傳遞過來的參數(shù)userState this.progressBar1.Value = e.ProgressPercentage; this.label1.Text = "處理進(jìn)度:" + Convert.ToString(e.ProgressPercentage) + "%"; //label2.Text = e.ProgressPercentage.ToString(); } public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.ToString()); return; } if (!e.Cancelled) this.label1.Text = "處理完畢!"; else this.label1.Text = "處理終止!"; } private void btnStop_Click(object sender, EventArgs e) { this.btnStart.Enabled = true; this.btnStop.Enabled = false; bgWorker.CancelAsync(); } }
多個(gè)線程的話,在A_DoWork開啟另外一個(gè)bw,可以一直套用。
總結(jié)。
主要是3個(gè)事件:
- bgWorker_DoWork:業(yè)務(wù)內(nèi)部處理大量數(shù)據(jù)的地方,后臺(tái)默默處理數(shù)據(jù)。(關(guān)于界面控件的東西,這里不要出現(xiàn),比如給控件賦值,這里不要出現(xiàn))
- bgWorker_ProgessChanged:每次業(yè)務(wù)內(nèi)部處理完成一部分時(shí),就會(huì)告訴界面我處理了什么,主要是給前臺(tái)顯示信息。(這里可以與前臺(tái)一起交互)
- bgWorker_WorkerCompleted:終止或者完成后就會(huì)進(jìn)入(這里可以是完成數(shù)據(jù)后,給控件賦值)
3個(gè)方法:
- RunWorkerAsync:向業(yè)務(wù)內(nèi)部傳遞處理數(shù)據(jù)的方法,傳遞集合,數(shù)值之類的
- ReportProgress:把處理的進(jìn)度告訴界面
- CancelAsync:取消操作會(huì)執(zhí)行此方法
到此這篇關(guān)于c#中使用BackgroundWorker的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c# BackgroundWorker內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CAD2008+VS2008開發(fā)ObjectARX加載失敗問題(推薦)
這篇文章主要介紹了CAD2008+VS2008開發(fā)ObjectARX加載失敗問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04C#微信公眾號(hào)開發(fā)之接收事件推送與消息排重的方法
這篇文章主要介紹了C#微信公眾號(hào)開發(fā)之接收事件推送與消息排重的方法,詳細(xì)分析了事件推送與消息排重的使用技巧,對(duì)微信開發(fā)有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼
這篇文章主要介紹了C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼,有需要的朋友可以參考一下2013-12-12C# Double轉(zhuǎn)化為String時(shí)的保留位數(shù)及格式方式
這篇文章主要介紹了C# Double轉(zhuǎn)化為String時(shí)的保留位數(shù)及格式方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02c#數(shù)據(jù)綁定之?dāng)?shù)據(jù)轉(zhuǎn)化為信息的示例
這篇文章主要介紹了c#數(shù)據(jù)綁定中的數(shù)據(jù)轉(zhuǎn)化為信息的示例,需要的朋友可以參考下2014-04-04C# web.config之<customErrors>節(jié)點(diǎn)說明案例詳解
這篇文章主要介紹了C# web.config之<customErrors>節(jié)點(diǎn)說明案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08