網站首頁 編程語言 正文
在客戶端中,為了防止界面假死狀態,或者不能拖動界面,可以使用BackgroundWorker。
1.在界面上拖動一個BackgroundWorker,label,進度條和2個button控件。BackgroundWorker也可以選擇在cs文件中new。
2.bgWorker_DoWork事件中接收到bgWorker.RunWorkerAsync("11111")
3.bgWorker_ProgessChanged事件中接收到bgWorker.ReportProgress方法傳遞過來的參數
?4.bgWorker_WorkerCompleted事件中主要處理線程暫停或者終止時的提示
5.中途取消操作后,也就是執行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"); //給業務傳遞參數,就是把前臺的要處理的參數傳遞進去
}
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//業務處理
object s = e.Argument; //這的e.Argument就是上面傳遞的參數 11111
for (int i = 0; i <= this.progressBar1.Maximum; i++)
{
if (bgWorker.CancellationPending) //此處關聯的是btnStop_Click事件中的這個bgWorker.CancelAsync();如果這個觸發了,那么就會停止。
{
e.Cancel = true;
return;
}
else
{
bgWorker.ReportProgress(i, "222222"); //向bgWorker_ProgessChanged事件傳遞參數,第一個是進度的參數,第二個是你要處理業務的參數
System.Threading.Thread.Sleep(1);
}
}
}
public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
//頁面處理
string state = (string)e.UserState;//接收上bgWorker.ReportProgress方法傳遞過來的參數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:業務內部處理大量數據的地方,后臺默默處理數據。(關于界面控件的東西,這里不要出現,比如給控件賦值,這里不要出現)
- bgWorker_ProgessChanged:每次業務內部處理完成一部分時,就會告訴界面我處理了什么,主要是給前臺顯示信息。(這里可以與前臺一起交互)
- bgWorker_WorkerCompleted:終止或者完成后就會進入(這里可以是完成數據后,給控件賦值)
3個方法:
- RunWorkerAsync:向業務內部傳遞處理數據的方法,傳遞集合,數值之類的
- ReportProgress:把處理的進度告訴界面
- CancelAsync:取消操作會執行此方法
原文鏈接:https://blog.csdn.net/u012563853/article/details/124042188
相關推薦
- 2023-05-24 pytorch中retain_graph==True的作用說明_python
- 2022-10-25 python庫-dotenv包?及?.env配置文件詳解_python
- 2023-05-30 Pandas.DataFrame行和列的轉置的實現_python
- 2022-11-26 docker安裝portainer方法詳細步驟_docker
- 2022-08-02 Shell判斷字符串變量是否為空的方法實現_linux shell
- 2022-10-11 ingress-nginx-url重寫的經驗總結
- 2022-06-08 利用AOP+Swagger注解實現日志記錄功能
- 2022-05-22 Flutter應用框架搭建之屏幕適配詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支