@hax
junior developer

Как реализовать ожидание готовности выполнения метода без использования цикла while?

Всем привет!
У меня есть два отдельных сервиса, которые как-то взаимосвязаны между собой. К одному я шлю запросы по HTTP, а от другого ожидаю ответа по веб сокетам.
Работает это примерно так:
static async void Run()
{
   await SendMessageToServer(); // отправить запрос по HTTP
   WaitResponseFromWebSocket(); // ожидать ответа по веб сокету
}


Вопрос: как сделать так, чтобы метод Run() не завершался, пока не придёт респонс от веб сокета? Можно ли отслеживать состояние ответа от веб сокета без использования цикла while?
Пробовал сделать через AutoResetEvent, но у меня метод Run() запускается через Task.Run, и почему-то WaitOne() не срабатывает в том месте.
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
lam0x86
@lam0x86
Если я правильно понимаю, обработчик сообщений от websocket'а у вас крутится где-то в другом месте. Вы можете создать общий TaskCompletionSource и в методе Run вызвать await tcs.Task;, а при приходе сообщения по сокету вызывать tcs.SetResult();.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
Websocket может послать ваше сообщение частями и в любом случае вам придется делать while до получения состояния EndOfMessage == true.
Ответ написан
Комментировать
@WinnerIT
Программист и фотограф-любитель
Если у Вас обе задачи асинхронны то можно сделать на подобии:
await Task.WhenAll(task1, task2);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы