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