private void showStatistics(string path)
{
Thread thread = new Thread(() =>
{
Statistics myClass= new Statistics(path);
list = myClass.getStatistics();
});
thread.Start();
foreach (KeyValuePair<string, string> item in list )
{
listBoxIps.Items.Add(item.Key + item.Value + "\n");
}
}
我想等到线程完成其工作然后启动foreach
,当我将foreach
放入线程时,收到交叉线程错误。
答案 0 :(得分:2)
你想要thread.Join。但这可能不是你想要做的(因为Join会阻塞,在这种情况下为什么甚至首先使用一个单独的线程)。查看BackgroundWorker课程。
答案 1 :(得分:1)
要等待Thread
完成,您可以使用Join
API。但是,在这种情况下,这可能不是您想要的。这里的Join
将导致整个UI阻塞,直到Thread
完成,这将破坏首先拥有该线程的目的。
另一种设计是产生Thread
并在通过BeginInvoke
完成后回调用户界面。假设getStatistics
返回List<KeyValuePair<string, string>
。
private void showStatistics(string path) {
Action<List<KeyValuePair<string, string>> action = list => {
foreach (KeyValuePair<string, string> item in list ) {
listBoxIps.Items.Add(item.Key + item.Value + "\n");
}
};
Thread thread = new Thread(() => {
Statistics myClass= new Statistics(path);
list = myClass.getStatistics();
this.BeginInvoke(action, list);
});
}
答案 2 :(得分:0)
创建共享变量,并使用它来表示线程的完成。在循环中,在线程启动后,执行:
while (!finished)
{
Application.DoEvents();
Thread.Sleep(10);
}
您的问题是,您希望自己的用户界面在list
填充时做出响应。这将确保它。