好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 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的正常点击等等操作呢?能做到么? |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|