#c_sharp #net #сокет #async_await
Как через async\await вызвать метод DisconnectAsync и дождаться его завершения у сокета? Этот метод не поддерживает TAP паттерн. Он поддерживает только старые асинхронные паттерны, с которыми я плохо знаком.
Ответы
Ответ 1
DisconnectAsync() действительно является старым API (EAP, event-based asynchronous pattern) и не поддерживает TAP. Однако, если ознакомиться с документаций по TAP, то можно найти рецепт "преобразования" EAP API в TAP. Для этого нужно воспользоваться классом TaskCompletionSource. public static Task DisconnectAsync(this Socket socket, SocketAsyncEventArgs args) { // TaskCompletionSource является обобщенным, // поэтому используем самый "маленький" тип, действительный результат нас не интересует var tcs = new TaskCompletionSource (); // подписываемся на завершение операции args.Completed += (s, e) => { if (e.SocketError == null) { // если операция завершилась успешно, устанавливаем результат таску tcs.SetResult(0); } else { // иначе устанавливаем исключение tcs.SetException(new Exception(e.SocketError.ToString())); } }; var finished = socket.DisconnectAsync(args); if (finished) { // операция завершилась синхронно, просто выходим return Task.Completed; } return tcs.Task; } Использование: await socket.DisconnectAsync(args);
Комментариев нет:
Отправить комментарий