.NET поддерживает работу приложения, ожидая завершения задачи - PullRequest
0 голосов
/ 11 апреля 2011

Я только что унаследовал приложение WinForms c # 4.0 (в основном, просто небольшую панель инструментов), которое использует шаблон «производитель-потребитель». Моя потребительская задача (буквально System.Threading.Tasks.Task) обрабатывает данные в очереди. Когда пользователь хочет закрыть приложение, производитель (сервер сокетов TCP) немедленно останавливается. Однако очередь может быть не пустой, поэтому мне нужно дать пользователю возможность немедленно выйти или выйти, как только задача потребителя закончит обработку всех данных из очереди. Если пользователь хочет дождаться завершения задачи потребителя, пользовательский интерфейс, естественно, должен оставаться отзывчивым. У меня проблема в том, что, поскольку код для выхода из приложения находится в обработчике события click для кнопки «Выход», мне может понадобиться дождаться завершения задачи потребителя, пока я нахожусь в обработчике события click. В двух словах, обработчик событий содержит этот (очень уродливый) код:

  // loop while there is still data in the queue
  while (QueuedData.Count > 0)
  {
    Application.DoEvents(); // UI is semi-responsive but with a lot of CPU utilization)
  }

  // the queue is empty so now exit the application

Может кто-нибудь предложить альтернативный способ реализации этой функциональности, чтобы я не зацикливался на обработчике событий в потоке пользовательского интерфейса? Имеет ли смысл в этот момент запускать другой поток / задачу для обработки этой проверки, а затем завершать работу приложения из этого потока? Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 11 апреля 2011

Обработка события закрытия, отмена его, добавление продолжения к задаче, закрывающей форму.

0 голосов
/ 11 апреля 2011

также использование такого цикла может быть довольно интенсивным использованием процессора, как вы уже упоминали.Почему бы не использовать шаблон Observer полностью, чтобы:

  • подписчик прослушивал обновления и помещал их в очередь в BlockingCollection (или любой другой коллекции Blocking)

  • другой фоновый поток будет ожидать элементы в указанной выше очереди и обрабатывать их по мере поступления

При выключении:

  • выпрекратить публикацию в очередь;

  • вы можете узнать, сколько элементов вы получили в очередь, и сообщить об этом через графический интерфейс, чтобы пользователь мог при необходимости ждать принудительного закрытия

ссылка MSDN на BlockingCollection

0 голосов
/ 11 апреля 2011

У вас может быть задача «Выход», поставленная в очередь в той же очереди [с помощью кнопки «Выход»] - когда очередь заканчивается, вызывается обработчик выхода.

Если вы хотите, вы можете обновить пользовательский интерфейс, чтобы сказать «Ожидается выход ...».

...