Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Как через async\await вызвать метод DisconnectAsync у сокета?

#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);

Комментариев нет:

Отправить комментарий