后台工作线程运行正常

本文关键字:运行 线程 工作 后台 | 更新日期: 2023-09-27 17:56:10

我最近尝试对foreach循环进行线程化,因为它在运行时冻结了UI。此循环查看一堆日志文件并从中逐行检索信息,然后将其添加到 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";
        }
    }

}

后台工作线程运行正常

不建议直接从BackgroundWorker.DoWork事件中更改 UI 的某些部分,而是建议在该方法中使用 BackgroundWorker.ReportProgress 并编辑 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;否则工作人员将无法报告进度。