C# 当报告进度和更新ui listView控件时,整个程序被卡住了,我可以';为什么不点击其他按钮?
我的意思是在backgroundworker中,我可以在backgroundworker工作时单击其他控件使用其他控件。但是,一旦我尝试更新ui listView控件,它也在更新,但其他一切都冻结/卡住了,在backgroundworker完成工作之前,我无法单击并使用任何其他控件C# 当报告进度和更新ui listView控件时,整个程序被卡住了,我可以';为什么不点击其他按钮?,c#,.net,winforms,C#,.net,Winforms,我的意思是在backgroundworker中,我可以在backgroundworker工作时单击其他控件使用其他控件。但是,一旦我尝试更新ui listView控件,它也在更新,但其他一切都冻结/卡住了,在backgroundworker完成工作之前,我无法单击并使用任何其他控件 int countUploadMsg = 0; private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
int countUploadMsg = 0;
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
MimeKit.HeaderList loaded = new MimeKit.HeaderList();
List<string> test = new List<string>();
int counter = 0;
MimekitallLoadedMessages = new List<MimeKit.MimeMessage>();
MimeKit.MimeMessage loadedMessage = null;
for (int i = 0; i < files.Length; i++)
{
string uid = seenUids[0];
loadedMessage = MimeKit.MimeMessage.Load(files[i].FullName);
downloaded.Add(seenUids[i]);
counter += 1;
int nProgress = counter * 100 / files.Length;
backgroundWorker2.ReportProgress(nProgress, loadedMessage);
}
}
到目前为止我尝试了什么?我添加了一个1毫秒的睡眠,然后在ReportProgress行之后的dowork事件中将其更改为50毫秒。当将睡眠时间设置为50毫秒时,工作正常,但速度非常慢
我还尝试在dowork事件中更新MimeKitalLoadedMessages列表,向其中添加loadedMessage,然后将MimeKitalLoadedMessages列表报告给e.UserState,或者仅使用该列表更新progressChanged事件中的listView
尝试在progressChanged中添加1ms睡眠
到目前为止,唯一的办法是在嫁妆活动中睡眠50毫秒,但世界卫生组织的进程变得非常缓慢
我也尝试了少量的文件,我在循环中修改了这些文件。长度从1000到500,同样的问题
即使将睡眠时间设置为50毫秒,也并非所有时间都能正常工作
MimeKit是一个电子邮件库,如果有任何问题:
我认为这是多线程面向对象编程的一个限制。您只能从负责UI元素的线程(UI线程)更新UI元素。我认为通常winforms会抛出异常,您可能会以某种方式禁用这些异常,或者被try/catch包装器捕获 这个问题的答案可能是你想要去的方向,但是对于你的情况可能有更干净的语法。 另外,请查看谷歌搜索结果链接中的任何结果: 编辑:信息越多越好;对于OP的问题,J.的答案可能是正确的。我没有意识到BackgroundWorker的ProgressChanged EH不是由BackgroundWorker的线程处理的。也许仔细检查DoWork是否没有抛出异常,并且从UI线程调用(躲闪gooses)BW。最先进的后台工作人员:
我认为这是多线程面向对象编程的一个限制。您只能从负责UI元素的线程(UI线程)更新UI元素。我认为通常winforms会抛出异常,您可能会以某种方式禁用这些异常,或者被try/catch包装器捕获 这个问题的答案可能是你想要去的方向,但是对于你的情况可能有更干净的语法。 另外,请查看谷歌搜索结果链接中的任何结果: 编辑:信息越多越好;对于OP的问题,J.的答案可能是正确的。我没有意识到BackgroundWorker的ProgressChanged EH不是由BackgroundWorker的线程处理的。也许仔细检查DoWork是否没有抛出异常,并且从UI线程调用(躲闪gooses)BW。最先进的后台工作人员:
问题在于,与后台线程相比,您在
ProgressChanged
处理程序中所做的工作更多。工作线程生成ProgressChanged
事件的速度快于主线程处理事件的速度
您可以在DoWork
for循环中以及ProgressChanged
处理程序中使用来计时方法块
您必须重新考虑您的方法-需要改变策略。问题是您在
ProgressChanged
处理程序中所做的工作比在后台线程中所做的要多。工作线程生成ProgressChanged
事件的速度快于主线程处理事件的速度
您可以在DoWork
for循环中以及ProgressChanged
处理程序中使用来计时方法块
您必须重新考虑您的方法-需要改变策略。这不是问题所在。OP正在
ProgressChanged
处理程序中执行UI更新,并且在创建BackgroundWorker
的线程(即:UI线程)上引发此事件。这不是问题所在。OP正在ProgressChanged
处理程序中执行UI更新,并且在创建BackgroundWorker
的线程(即:UI线程)上引发此事件。
private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbt1.Value = e.ProgressPercentage;
pbt1.Text = e.ProgressPercentage.ToString() + "%";
pbt1.Invalidate();
label9.Text = countUploadMsg.ToString();
label9.Visible = true;
MimeKit.MimeMessage Msg = e.UserState as MimeKit.MimeMessage;
ListViewCostumControl.lvnf.Items.Add(Msg.ToString());
}