getstr88 发表于 2022-6-28 15:30

锁贴吧,写的文字太多,回复的都没耐心看,回的都跑偏了

本帖最后由 getstr88 于 2022-6-28 16:55 编辑

情景是:


我需要在backgroundWorker中处理一批图片,同时把处理进度在 winform主界面的一个label中显示为:共XX个图片,已经处理了XX个,XX个无法处理   这样子


所以在backgroundWorker的DoWork函数中,代码类似



foreach(每个图片)
{
      先处理推片
       ……
      invoke(new Action() =>label1.text = xxxxx)
}


但是,因为处理每张图还算快,处理完一张后invoke,在主线程中修改label显示

就导致了。主界面中,用户点击其他控件什么的,很难有响应(因为正好backgroundWorker中执行invoke,所以winform接受不了用户点击。)


感觉这个问题应该是个挺通用的问题吧,刚接触winform不久,不知道常规处理方法是什么(相信微软肯定有很正规的解决方案,让代码也很优雅)






其实,也不一定和backgroundWorker有关。就算没有backgroundWorker。如果在winform中一直用代码操作UI,也会导致其他UI响应不了事件(表现上,按钮还能有按下的动画,也不会表现卡界面,但并不会响应事件)


比如我刚写的例子:点击button2,开始一个循环,10s内都会持续改label的内容。虽然每改一次都会Application.DoEvents();。但是因为while执行快。在主界面中会发现,button3想被响应,太难了。狂点很多次,才能被凑巧响应


isStop=false;

private void button2_Click(object sender, EventArgs e)
      {
            DateTime dt = DateTime.Now;
            DateTime dt2 = DateTime.Now + TimeSpan.FromSeconds(20);
            while (DateTime.Now < dt2)
            {
                if (isStop == true)
                {
                  MessageBox.Show("结束了");
                  return;
                }
                else
                {
                  label1.Text = DateTime.Now.ToString();
                }
                Application.DoEvents();
            }
      }

      private void button3_Click(object sender, EventArgs e)
      {
            isStop = true;
      }




所以,我这个问题也算和backgroundWorker不一定有关系。就是说,如何在某些UI持续改变显示时,不影响其他UI的正常点击等等操作呢?能做到么?

你好港屿 发表于 2022-6-28 15:50

试试这个 BeginInvoke

getstr88 发表于 2022-6-28 15:56

你好港屿 发表于 2022-6-28 15:50
试试这个 BeginInvoke

能具体说说么?

我上面后面也说了,实际和backgroundWorker无关算是

那么就都是winfrom主线程中我上面举的那个例子,怎么解决呢

Domado 发表于 2022-6-28 16:06

微软规定的正确做法是在另一个子线程进行耗时操作,而不是在主线程进行耗时操作。

我心飞翔1995 发表于 2022-6-28 16:23

getstr88 发表于 2022-6-28 15:56
能具体说说么?

我上面后面也说了,实际和backgroundWorker无关算是


基础都不扎实,告诉你不要在主线程操作,也不懂基础原理,看不懂别人的回答
WINFORM 底层原理的讲解(发布订阅)_2b勿扰的博客-CSDN博客
https://blog.csdn.net/weixin_41181778/article/details/103281044

getstr88 发表于 2022-6-28 16:25

我心飞翔1995 发表于 2022-6-28 16:23
基础都不扎实,告诉你不要在主线程操作,也不懂基础原理,看不懂别人的回答
WINFORM 底层原理的讲解(发 ...

你真是到处灌水。我backgroundWorker操作的,你不看帖子么

你明白我问什么的,就开始灌

猫吃 发表于 2022-6-28 16:47

我觉得是应该另开一个线程去操作你的耗时处理,然后你去更新UI,但是我没写过代码,你请教一下大佬吧

getstr88 发表于 2022-6-28 16:50

结贴结贴,彻底被带偏了。这个和线程没关系。

UI线程中持续不断,更新UI的时候,没法响应点击

爱飞的猫 发表于 2022-7-9 06:36

getstr88 发表于 2022-6-28 16:50
结贴结贴,彻底被带偏了。这个和线程没关系。

UI线程中持续不断,更新UI的时候,没法响应点击

主线程加个时钟,定期更新进度即可。
例如 0.5s 更新一次。
页: [1]
查看完整版本: 锁贴吧,写的文字太多,回复的都没耐心看,回的都跑偏了