Как я могу сказать, закончил ли поток выполнение без опроса ThreadState? - PullRequest
2 голосов
/ 03 июня 2009

Есть ли элегантный способ узнать, когда рабочий поток завершается, чтобы я мог получить доступ к ресурсам, которые он создал?

Например, если рабочий поток запросил список SQL-серверов, используя

ServersSqlDataSourceEnumerator.Instance.GetDataSources();

и сохранил результат в переменной DataTable, какой механизм я могу использовать, чтобы узнать, когда эта переменная DataTable была заполнена / доступна. Я не хочу опрашивать ThreadState; было бы идеально запустить событие, когда оно выполнено, чтобы я мог выполнять действия с результатом.

Спасибо!

Ответы [ 5 ]

5 голосов
/ 03 июня 2009

Вы можете использовать механизм обратного вызова или блокировать событие, чтобы узнать о завершении асинхронной операции. См. Эту страницу для модели асинхронного программирования в .net - вы можете вызвать BeginInvoke для любого делегата, чтобы выполнить действие в асинхронном режиме.

Если вы используете тип BackgroundWorker, вы можете подписаться на событие RunWorkerCompleted .

1 голос
/ 03 июня 2009

Вы можете проверить мой ответ на этой ТА темы

Используется механизм обратного вызова. Когда асинхронная операция завершена, она запустит метод обратного вызова, где вы сможете обработать обработку, которая должна быть выполнена после выполнения SQL.

Используйте аналогичный подход, чтобы получать уведомления при выполнении асинхронной операции.

Надеюсь, это поможет:)

1 голос
/ 03 июня 2009

В этом случае я получаю, чтобы WorkerThread вызывал функцию после завершения работы, которая вызовет поток пользовательского интерфейса, который может выполнять работу, в которой вы нуждаетесь.

* 1003 Е.Г. *

private void SetWorkerThreadToDoWork()
{
  WorkerThread.Start();
}

private void MyWorkerThreadWork()
{
  //This will be on the WorkerThread (called from WorkerThread.Start())
  DoWorkFunc();
  WorkComplete();
}

private void WorkComplete()
{
  if(InvokeRequired == true)
  {
    //Do the invoke
  }
  else
  {
  //Check work done by worker thread
  //e.g. ServersSqlDataSourceEnumerator.Instance.GetDataSources();
  }
}

Если вы используете простой процесс, я бы выбрал BackgroundWorkerThread, он имеет свои собственные события, которые запускаются по завершении работы. Но если вам требуется использовать поток, я бы либо обратился к асинхронным обратным вызовам, либо к маршруту, аналогичному показанному выше.

1 голос
/ 03 июня 2009

Итак, запустите событие: -P

Вы также можете посмотреть на использование AutoResetEvent:
http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

0 голосов
/ 03 июня 2009

Я не программирую на C #, но вот что я сделал с Delphi, может быть, вы можете сделать это также с C #. У меня есть потомок TThread, и в случае «уничтожения» я отправляю его создателю сообщение «эй, я скоро умру!». Таким образом, его родитель (который является основным потоком) создает новый, если ему нужен новый. Чтобы быть точным, он запускает таймер, который при срабатывании создает новый поток, если требуется новый (время сосания сайтов (смеется) !!).

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