锁贴吧,写的文字太多,回复的都没耐心看,回的都跑偏了
本帖最后由 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的正常点击等等操作呢?能做到么? 试试这个 BeginInvoke 你好港屿 发表于 2022-6-28 15:50
试试这个 BeginInvoke
能具体说说么?
我上面后面也说了,实际和backgroundWorker无关算是
那么就都是winfrom主线程中我上面举的那个例子,怎么解决呢 微软规定的正确做法是在另一个子线程进行耗时操作,而不是在主线程进行耗时操作。 getstr88 发表于 2022-6-28 15:56
能具体说说么?
我上面后面也说了,实际和backgroundWorker无关算是
基础都不扎实,告诉你不要在主线程操作,也不懂基础原理,看不懂别人的回答
WINFORM 底层原理的讲解(发布订阅)_2b勿扰的博客-CSDN博客
https://blog.csdn.net/weixin_41181778/article/details/103281044 我心飞翔1995 发表于 2022-6-28 16:23
基础都不扎实,告诉你不要在主线程操作,也不懂基础原理,看不懂别人的回答
WINFORM 底层原理的讲解(发 ...
你真是到处灌水。我backgroundWorker操作的,你不看帖子么
你明白我问什么的,就开始灌 我觉得是应该另开一个线程去操作你的耗时处理,然后你去更新UI,但是我没写过代码,你请教一下大佬吧 结贴结贴,彻底被带偏了。这个和线程没关系。
UI线程中持续不断,更新UI的时候,没法响应点击 getstr88 发表于 2022-6-28 16:50
结贴结贴,彻底被带偏了。这个和线程没关系。
UI线程中持续不断,更新UI的时候,没法响应点击
主线程加个时钟,定期更新进度即可。
例如 0.5s 更新一次。
页:
[1]