如何使用背景工作器?

如何使用背景工作器?

我知道它有三种方法。在我的程序中,我有一个发送消息的方法。通常是很晚,程序有时根本不发送信息,以响应按钮按下。有时,与我所期望的相比,它已经晚到了5秒,程序冻结了。我想用BackgroundWorker按预期发送消息,并允许程序在任何时候正常运行。我有在按钮处理程序中发送消息的代码。现在我该把这个等价的代码放哪儿呢?我希望所有这一切仍由按钮按下处理。

这是合适的处理程序吗?

backgroundWorker1.RunWorkerAsync();

在以下方面:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {}

我要把我的代码放到按钮处理程序中?在此之前:

carga.progressBar1.Minimum = 0;carga.progressBar1.Maximum = 100;

Carga是我使用ProgressBar的另一种形式。在这种情况下,我如何使用背景工作器?


米脂
浏览 330回答 2
2回答

神不在的星期二

我知道这有点老了,但是如果另一个初学者正在经历这种情况,我将分享一些代码,这些代码将涵盖更多的基本操作,这里还有另一个示例,它还包括取消进程并向用户报告进程状态的选项。我将在上面的解决方案中添加Alex Aza给出的代码public&nbsp;Form1(){ &nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent(); &nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.DoWork&nbsp;+=&nbsp;backgroundWorker1_DoWork; &nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.ProgressChanged&nbsp;+=&nbsp;backgroundWorker1_ProgressChanged; &nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.RunWorkerCompleted&nbsp;+=&nbsp;backgroundWorker1_RunWorkerCompleted;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//Tell&nbsp;the&nbsp;user&nbsp;how&nbsp;the&nbsp;process&nbsp;went &nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.WorkerReportsProgress&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.WorkerSupportsCancellation&nbsp;=&nbsp;true;&nbsp;//Allow&nbsp;for&nbsp;the&nbsp;process&nbsp;to&nbsp;be&nbsp;cancelled} &nbsp;&nbsp;&nbsp;&nbsp;//Start&nbsp;Processprivate&nbsp;void&nbsp;button1_Click(object&nbsp;sender,&nbsp;EventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.RunWorkerAsync();}//Cancel&nbsp;Processprivate&nbsp;void&nbsp;button2_Click(object&nbsp;sender,&nbsp;EventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;//Check&nbsp;if&nbsp;background&nbsp;worker&nbsp;is&nbsp;doing&nbsp;anything&nbsp;and&nbsp;send&nbsp;a&nbsp;cancellation&nbsp;if&nbsp;it&nbsp;is &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(backgroundWorker1.IsBusy) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.CancelAsync(); &nbsp;&nbsp;&nbsp;&nbsp;}}private&nbsp;void&nbsp;backgroundWorker1_DoWork(object&nbsp;sender,&nbsp;System.ComponentModel.DoWorkEventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;100;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(1000); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.ReportProgress(i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Check&nbsp;if&nbsp;there&nbsp;is&nbsp;a&nbsp;request&nbsp;to&nbsp;cancel&nbsp;the&nbsp;process &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(backgroundWorker1.CancellationPending) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.Cancel&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.ReportProgress(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//If&nbsp;the&nbsp;process&nbsp;exits&nbsp;the&nbsp;loop,&nbsp;ensure&nbsp;that&nbsp;progress&nbsp;is&nbsp;set&nbsp;to&nbsp;100% &nbsp;&nbsp;&nbsp;&nbsp;//Remember&nbsp;in&nbsp;the&nbsp;loop&nbsp;we&nbsp;set&nbsp;i&nbsp;<&nbsp;100&nbsp;so&nbsp;in&nbsp;theory&nbsp;the&nbsp;process&nbsp;will&nbsp;complete&nbsp;at&nbsp;99% &nbsp;&nbsp;&nbsp;&nbsp;backgroundWorker1.ReportProgress(100);}private&nbsp;void&nbsp;backgroundWorker1_ProgressChanged(object&nbsp;sender,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;System.ComponentModel.ProgressChangedEventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;progressBar1.Value&nbsp;=&nbsp;e.ProgressPercentage;}private&nbsp;void&nbsp;backgroundWorker1_RunWorkerCompleted(object&nbsp;sender,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;System.ComponentModel.RunWorkerCompletedEventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(e.Cancelled) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lblStatus.Text&nbsp;=&nbsp;"Process&nbsp;was&nbsp;cancelled"; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(e.Error&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lblStatus.Text&nbsp;=&nbsp;"There&nbsp;was&nbsp;an&nbsp;error&nbsp;running&nbsp;the&nbsp;process.&nbsp;The&nbsp;thread&nbsp;aborted"; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lblStatus.Text&nbsp;=&nbsp;"Process&nbsp;was&nbsp;completed"; &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP