У меня есть темы:Как вернуть awaitable (Task?), Что ждет события в Диспетчерской Теме
- UI нить с диспетчерской петлей
- фонового поток, который прослушивает сообщения в рамках массового обслуживания.
при получении сообщения, событие вызывается в фоновом потоке:
messageReceiver.Received += (sender, args) => ...
В UI потоке я хотел бы, чтобы ждать сообщение, что-то вроде этого:
void ButtonClicked(object sender, RoutedEventArgs e) {
await NextMessage(); //should return when messageReceiver.Received is fired
}
Как реализовать ожидаемый метод NextMessage, поэтому он не создает новый поток каждый раз?
Класс SemaphoreSlim
, где я могу подождать WaitAsync, но создается новый поток, который блокируется до тех пор, пока не будет выпущен SemaphoreSlim.
Возможно, TaskCompletionSource
- это путь? Какую TaskCreationOption следует использовать?
'SemaphoreSlim' не создает поток. –
Так в чем же разница между 'СемафорСлим.WaitAsync' и' TaskCompletionSource.Task'? – Liero
'TaskCompletionSource' - одноразовое уведомление. 'СемафорСлим' можно использовать повторно. Существуют и другие различия, но это наиболее применимо к этой дискуссии. –