如何等到我的线程完成

本文关键字:线程 我的 | 更新日期: 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时具有响应性。 这将确保这一点。