我的意思是在backgroundworker中,我可以点击其他控件在backgroundworker工作时使用其他控件。但是,一旦我试图更新ui listView控件它正在更新,但一切都冻结/卡住,我不能点击并使用任何其他控件,直到backgroundworker完成工作。当报告进度和更新ui listView控件时,整个程序卡住了,我不能点击其他按钮,为什么?
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);
}
}
的progresschanged事件
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());
}
没有我尝试到目前为止什么?我在1分钟后添加了Sleep,然后在ReportProgress行之后的dowork事件中将其更改为50ms。当把睡眠设置为50ms时,它工作正常,但后来非常缓慢。
我还尝试更新doweting事件中的MimekitallLoadedMessages列表,将其加载到loadedMessage中,然后将MimekitallLoadedMessages列表报告给e.UserState,或者只是使用List更新progressChanged事件中的listView。
试图在progressChanged中添加1ms的睡眠。
到目前为止,只有睡眠时间为50毫秒,但后来变得非常缓慢。
我试着用少量的文件,我在dowcur中的文件循环改变了。长到1000甚至到500和同样的问题。
即使将睡眠设置为50ms,并非所有时间都能正常工作。
MimeKit是一个电子邮件lib如果它在所有问题:
这是没有问题的。 OP在'ProgressChanged'处理程序做UI更新,并引发此事件创建了'BackgroundWorker'的线程上(即:UI线程)。 –