如何等到我的线程完成
本文关键字:线程 我的 | 更新日期: 2023-09-27 18:27:16
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
放入线程时,收到交叉线程错误。
你想要线程。加入。但这可能不完全是您要做的(因为 Join 会阻塞,在这种情况下,为什么首先使用单独的线程(。查看 BackgroundWorker 类。
要等待Thread
完成,您可以使用Join
API。 但是,在这种情况下,这可能不是您想要的。 此处的Join
将导致整个 UI 阻塞,直到Thread
完成,这将破坏首先拥有线程的目的。
另一种设计是生成Thread
,并在完成后通过 BeginInvoke
将其回调到 UI 中。 假设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);
});
}
创建共享变量,并使用它来表示线程的完成。 在循环中,线程启动后,执行以下操作:
while (!finished)
{
Application.DoEvents();
Thread.Sleep(10);
}
您的问题是您希望 UI 在填充list
时具有响应性。 这将确保这一点。