Страницы

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

понедельник, 19 ноября 2018 г.

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

Как через async\await вызвать метод DisconnectAsync и дождаться его завершения у сокета? Этот метод не поддерживает TAP паттерн. Он поддерживает только старые асинхронные паттерны, с которыми я плохо знаком.


Ответ

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

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

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