c#中使用BackgroundWorker的實現(xiàn)
在客戶端中,為了防止界面假死狀態(tài),或者不能拖動界面,可以使用BackgroundWorker。
1.在界面上拖動一個BackgroundWorker,label,進度條和2個button控件。BackgroundWorker也可以選擇在cs文件中new。

2.bgWorker_DoWork事件中接收到bgWorker.RunWorkerAsync("11111")

3.bgWorker_ProgessChanged事件中接收到bgWorker.ReportProgress方法傳遞過來的參數(shù)

4.bgWorker_WorkerCompleted事件中主要處理線程暫停或者終止時的提示

5.中途取消操作后,也就是執(zhí)行bgWorker.CancelAsync()此方法。bgWorker.CancellationPending會變成true


所有代碼:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
if (bgWorker.IsBusy) //判斷是否正在運行異步操作
return;
this.progressBar1.Maximum = 100; //設置進度條最大值
this.btnStart.Enabled = false;
this.btnStop.Enabled = true;
bgWorker.RunWorkerAsync("11111"); //給業(yè)務傳遞參數(shù),就是把前臺的要處理的參數(shù)傳遞進去
}
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//業(yè)務處理
object s = e.Argument; //這的e.Argument就是上面?zhèn)鬟f的參數(shù) 11111
for (int i = 0; i <= this.progressBar1.Maximum; i++)
{
if (bgWorker.CancellationPending) //此處關聯(lián)的是btnStop_Click事件中的這個bgWorker.CancelAsync();如果這個觸發(fā)了,那么就會停止。
{
e.Cancel = true;
return;
}
else
{
bgWorker.ReportProgress(i, "222222"); //向bgWorker_ProgessChanged事件傳遞參數(shù),第一個是進度的參數(shù),第二個是你要處理業(yè)務的參數(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 = "處理進度:" + 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();
}
}多個線程的話,在A_DoWork開啟另外一個bw,可以一直套用。

總結。
主要是3個事件:
- bgWorker_DoWork:業(yè)務內部處理大量數(shù)據(jù)的地方,后臺默默處理數(shù)據(jù)。(關于界面控件的東西,這里不要出現(xiàn),比如給控件賦值,這里不要出現(xiàn))
- bgWorker_ProgessChanged:每次業(yè)務內部處理完成一部分時,就會告訴界面我處理了什么,主要是給前臺顯示信息。(這里可以與前臺一起交互)
- bgWorker_WorkerCompleted:終止或者完成后就會進入(這里可以是完成數(shù)據(jù)后,給控件賦值)
3個方法:
- RunWorkerAsync:向業(yè)務內部傳遞處理數(shù)據(jù)的方法,傳遞集合,數(shù)值之類的
- ReportProgress:把處理的進度告訴界面
- CancelAsync:取消操作會執(zhí)行此方法
到此這篇關于c#中使用BackgroundWorker的實現(xiàn)的文章就介紹到這了,更多相關c# BackgroundWorker內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#使用StructLayout特性來控制內存結構的操作代碼
在C#中,內存布局對于性能優(yōu)化和與非托管代碼的互操作性至關重要,StructLayout特性允許開發(fā)者控制結構在內存中的布局方式,本文給大家介紹了C#使用StructLayout特性來控制內存結構的操作,需要的朋友可以參考下2024-10-10
基于StreamRead和StreamWriter的使用(實例講解)
下面小編就為大家分享一篇基于StreamRead和StreamWriter的使用實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11

