У меня есть этот код:ждут какого-либо метод асинхронных и (событие или логический)
ManualResetEvent EventListenerStopped;
...
while (true)
{
IAsyncResult iar = this.ListenerHttp.BeginGetContext(ProcessRequest, null);
if (WaitHandle.WaitAny(new[] { this.EventListenerStopped, iar.AsyncWaitHandle }) == 0)
return;
}
В основном он ждет любого из двух событий:
- если запрос получен, он обрабатывает его и дождитесь следующего.
- если EventListenerStopped поднят, он выходит из цикла.
Этот код работает в производстве красиво уже довольно давно.
Я хотел попробовать и преобразовать его в новый механизм ожидания/асинхронности и, похоже, не может найти хороший простой способ сделать это.
Я попробовал с булевым, вызывающий может обратиться к false. Это, очевидно, не работает, как он выходит из цикла только после того, как новый запрос был получен и обработан:
bool RunLoop;
...
while (this.RunLoop)
{
HttpListenerContext listenerContext = await this.ListenerHttp.GetContextAsync();
ProcessRequest(listenerContext);
}
Я интересно, если это возможно даже переписать мой простой цикл в старом стиле с асинхронным/ждут. Если да, хотел бы кто-нибудь показать мне, как это сделать?
Вы пытались остановить слушателя вместо использования bool? – alexm
@ Мики Я понимаю, что они не то же самое. Я имел в виду: есть ли способ достичь чего-то подобного с async/await (я смущенно думал о какой-то Task.WaitAny(), где одна из задач будет проверять повышение некоторых логических ...) – user1409737
@alexm Я сам не пробовал, но читал где-то на SO, что это не должно быть сделано, поскольку оно нарушит любой обработанный запрос (ну, объект ListenerContext передается в threadpool для обработки в моем случае ...) – user1409737