我最近尝试过一个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";
}
}
}
答案 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;
,否则工作人员将无法报告进度。