Как я могу сказать, закончил ли поток выполнение без опроса ThreadState?

2

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

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

ServersSqlDataSourceEnumerator.Instance.GetDataSources();

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

Спасибо!

Теги:
multithreading

5 ответов

5
Лучший ответ

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

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

  • 0
    +1 О, очень мило! Я сейчас проверяю ссылку на модель асинхронного программирования и могу использовать один из перечисленных здесь примеров. Спасибо!!
1

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

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

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

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

1

Чтобы запустить событие: -P

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

  • 0
    Это потребует какого-то опроса, которого я пытаюсь избежать. Я ищу решение, которое включает в себя создание потоков, выполнение и уведомление о завершении. Возможность прерывания потока также является необходимостью.
  • 0
    +1 за комментарий "так запусти событие"
1

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

например.

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, это связано с его собственными событиями, которые запускаются, когда работа завершена. Но если вам потребуется использовать Thread, я бы либо посмотрел на Asynchronous Callbacks, либо на аналогичный маршрут, показанный выше.

0

Я не программирую на С#, но здесь, что я сделал с Delphi, возможно, вы также можете сделать это с С#. У меня есть потомок TThread, и в событии "destroy" я отправляю сообщение своему создателю, говоря: "Эй, я скоро умру!". Таким образом, его родительский элемент (который является основным потоком) создает новый, если ему нужен новый. Если быть точным, он запускает таймер, который при запуске создает новый поток, если требуется новый (время сосания сайтов (lol)!).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню