吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 945|回复: 8
收起左侧

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

[复制链接]
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

能具体说说么?

我上面后面也说了,实际和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的时候,没法响应点击

点评

主线程加个时钟,定期更新进度即可。 例如 0.5s 更新一次。  详情 回复 发表于 2022-7-9 06:36
爱飞的猫 发表于 2022-7-9 06:36
getstr88 发表于 2022-6-28 16:50
结贴结贴,彻底被带偏了。这个和线程没关系。

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

主线程加个时钟,定期更新进度即可。
例如 0.5s 更新一次。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表