1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C# 防止界面假死 多线程进度条的合理使用

C# 防止界面假死 多线程进度条的合理使用

时间:2024-03-16 19:50:36

相关推荐

C# 防止界面假死 多线程进度条的合理使用

好长时间没发博了 。。

这两天用C#写了一个批量分割图片前景的软件,最初的时候没用多线程,执行批量分割就假死,后来就换成了多线程,结果还是假死。。

网上找了几篇博文看了看,才发现错误的地方。

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

//点击按钮开始工作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 这样就不会一直占用着主界面的刷新 }}//设置进度条的Valueprivate 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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。