Как дождаться окончания моей темы - PullRequest
1 голос
/ 10 марта 2012
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 ]

2 голосов
/ 10 марта 2012

Вы хотите нить. Присоединяйтесь .Но это, вероятно, не совсем то, что вы пытаетесь сделать (потому что Join блокирует, и в этом случае зачем вообще использовать отдельный поток).Посмотрите на BackgroundWorker класс.

1 голос
/ 10 марта 2012

Чтобы дождаться завершения Thread, вы можете использовать Join API.Однако это скорее всего не то, что вы хотите в этом сценарии.Join в этом случае приведет к блокировке всего пользовательского интерфейса до завершения 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);
  });
}
0 голосов
/ 10 марта 2012

Создайте общую переменную и используйте ее, чтобы сигнализировать о завершении потока. В цикле после запуска потока выполните:

while (!finished)
{
     Application.DoEvents();
     Thread.Sleep(10);
}

Ваша проблема в том, что вы хотите, чтобы ваш пользовательский интерфейс реагировал на заполнение list. Это обеспечит это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...