Итак, как все знают, фреймворки, такие как asp.NET, WPF и WinRT, управляют одним или несколькими потоками для вас. В asp.NET Framework объединяет набор потоков, которые принимают запросы из очереди и обрабатывают их. В WPF структура управляет потоком пользовательского интерфейса для вас, который принимает сообщения от насоса сообщений.Повторно использовать ожидаемую нить
Это может быть достигнуто простым подходом производителя/потребителя, когда потребляющий поток выполняет цикл while(true)
, принимает сообщения из очереди и использует обработчик сообщений (код пользователя) для их выполнения. Достаточно просто. Здесь вы можете найти базовую реализацию: https://stackoverflow.com/a/5828863/857807
С введением семантики async/await вы можете делегировать работу с процессором/IO в какой-либо другой поток и оставить поток (например) потока пользовательского интерфейса. Это означает, что поток пользовательского интерфейса будет продолжать принимать сообщения от насоса.
Мой вопрос: начиная с вышеупомянутой базовой реализации, как потребитель мог бы реализовать это? Как вы узнаете, что обработчик сообщений асинхронно ожидает завершения другого потока и, следовательно, принимает другое сообщение из очереди? Уверен, что мне здесь что-то не хватает.
Вы спрашиваете, как это делают потоки WPF/etc UI, или как вы это сделаете сами по определенному потоку? –
Я уверен, что фактическая реализация фреймворка для меня немного переполнена, я просто хочу знать суть этого. Я не пытаюсь реализовать его сам, но я хотел бы знать, как я это сделаю, если захочу, из любопытства. – dcastro