BackgroundWorker正常运行

时间:2016-07-10 20:05:16

标签: c#

我最近尝试过一个foreach循环,因为它在运行时冻结了UI。这个循环查看一堆日志文件并逐行检索它们的信息,然后将其添加到listView(也将内容打印到richtextBox)。我遇到的问题是,在线程化这个循环之后,似乎listView和richTextBox都不再更新。我知道该方法正在被调用,因为当我在'if语句'之后放置一个MessageBox时,它打开就好了,但其他一切都拒绝工作。

public void searchForAll(object sender, DoWorkEventArgs e)
    {
        if (//argument)
        {
            listViewEx1.Items.Clear();
            int logcount = 0;
            richTextBoxEx1.Text += "Print something";
            richTextBoxEx1.Text += "\n";
            richTextBoxEx1.SelectionStart = richTextBoxEx1.Text.Length;
            richTextBoxEx1.ScrollToCaret();
            foreach (User user in s.Friends)
            {
                foreach (string log in Directory.GetFiles(path, "*.log"))
                {
                    string[] fileToRead = File.ReadAllLines(log);
                    foreach (string line in fileToRead)
                    {
                        if (line.Contains(user.Handle) && line.Contains("-r"))
                        {

                            if (!isDuplicate(c))
                            {
                                listViewEx1.Items.Add(new ListViewItem(user.Handle)
                                {
                                    SubItems = { c }
                                });
                                dupCheck.Add(c);
                                logcount++;
                            }

                        }

                    }

                }
                dupCheck.Clear();
                Thread.Sleep(1000);
            }
            richTextBoxEx1.Text += "Print something";
        }

    }

}

1 个答案:

答案 0 :(得分:0)

建议不要在BackgroundWorker.DoWork事件中直接更改部分UI,而是建议使用BackgroundWorker.ReportProgress并在THAT方法中编辑UI。

以下是我将如何实现将文本框的值更改为“x”的示例:

public void searchForAll(object sender, DoWorkEventArgs e)
{
   //Define background worker
   var MyBack = (BackgroundWorker)sender;
   for(...)
   {
     //Send some data to ReportProgress
     MyBack.ReportProgress(0, "any object of any form goes here");
   }
}

然后在报告进度方法中:

private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
  textBox1.Text = e.UserState.ToString();
}

请注意,您必须设置Backgroundworker1.WorkerReportsProgress = true;,否则工作人员将无法报告进度。