Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当报告进度和更新ui listView控件时,整个程序被卡住了,我可以';为什么不点击其他按钮?_C#_.net_Winforms - Fatal编程技术网

C# 当报告进度和更新ui listView控件时,整个程序被卡住了,我可以';为什么不点击其他按钮?

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)

我的意思是在backgroundworker中,我可以在backgroundworker工作时单击其他控件使用其他控件。但是,一旦我尝试更新ui listView控件,它也在更新,但其他一切都冻结/卡住了,在backgroundworker完成工作之前,我无法单击并使用任何其他控件

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());
      }