winform跨線程更新ui,C# 防止界面假死 多線程進度條的合理使用

 2023-10-05 阅读 168 评论 0

摘要:好長時間沒發博了 。。 這兩天用C#寫了一個批量分割圖片前景的軟件,最初的時候沒用多線程,執行批量分割就假死,后來就換成了多線程,結果還是假死。。 網上找了幾篇博文看了看,才發現錯誤的地方。 好了,首先看不合理的情況。 winfor

好長時間沒發博了 。。

這兩天用C#寫了一個批量分割圖片前景的軟件,最初的時候沒用多線程,執行批量分割就假死,后來就換成了多線程,結果還是假死。。

網上找了幾篇博文看了看,才發現錯誤的地方。

好了,首先看不合理的情況。

winform跨線程更新ui。

//點擊按鈕開始工作
private void btnStartWorking_Click(object sender, EventArgs e)
{Thread multi = new Thread(new ThreadStart(StartWork));multi.IsBackground = true;multi.Start();           
}//定義一個委托
private delegate void DelegateFunction();//執行函數void StartWork()
{if (this.progressBar.InvokeRequired){DelegateFunction df = new DelegateFunction(StartMultiWork);this.Invoke(df);}else{                progressBar.Maximum = 10000;for (int i = 1; i <= 10000;i++ ){//...........//在這里執行一個非常非常耗時的函數 DoLongTimeWork()DoLongTimeWork();//...........progressBar.Value = i;Application.DoEvents(); //讓主窗體去執行消息列隊的其他指令}}}

上面的代碼中雖然有Application.DoEvents()函數,但是軟件在兩個Application.DoEvents()之間,程序主界面會死一陣子。說道這里,貌似很明了了。

下面這樣就行了

//點擊按鈕開始工作
private void btnStartWorking_Click(object sender, EventArgs e)
{Thread multi = new Thread(new ThreadStart(StartWork));multi.IsBackground = true;multi.Start();           
}//定義一個委托
private delegate void DelegateFunction(int ipos);//執行函數void StartWork()
{  //設置進度條最大值 this.progressBar.Maxmum = 10000;for (int i = 1; i <= 10000;i++ ){//...........//在這里執行一個非常非常耗時的函數 DoLongTimeWork()DoLongTimeWork();//...........SetPos(i); //關鍵就在這里,只有將要更改progressBar的value的時候 才去Invoke 這樣就不會一直占用著主界面的刷新  }
}
//設置進度條的Value
private void SetPos(int ipos)
{if (this.progressBar.InvokeRequired){DelegateFunction df = new DelegateFunction(StartMultiWork);this.Invoke(df,new object[]{ipos});}else{ProgressBar.Value = Int32.Parse(ipos);}}


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/123967.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息