如何等到我的线程完成

时间:2012-03-10 16:46:06

标签: c# winforms multithreading

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放入线程时,收到交叉线程错误。

3 个答案:

答案 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填充时做出响应。这将确保它。