后台工作线程运行正常
本文关键字:运行 线程 工作 后台 | 更新日期: 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;
否则工作人员将无法报告进度。