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

235
21 сентября 2017, 13:00

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

Answer 1

DisconnectAsync() действительно является старым API (EAP, event-based asynchronous pattern) и не поддерживает TAP. Однако, если ознакомиться с документаций по TAP, то можно найти рецепт "преобразования" EAP API в TAP. Для этого нужно воспользоваться классом TaskCompletionSource<T>.

public static Task DisconnectAsync(this Socket socket, SocketAsyncEventArgs args)
{
    // TaskCompletionSource является обобщенным,
    // поэтому используем самый "маленький" тип, действительный результат нас не интересует
    var tcs = new TaskCompletionSource<byte>();
    // подписываемся на завершение операции
    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);
READ ALSO
как обратиться к вложенной функции?

как обратиться к вложенной функции?

как обратиться к функции dsa?

323
Пояснить отрывок кода на javascript

Пояснить отрывок кода на javascript

Прошу пояснить словами что в нем происходит, соответственно для дальнейшего обучения

333
Как обновить стиль span&#39;а при смене данных на ajax?

Как обновить стиль span'а при смене данных на ajax?

Есть 5 значений, хранящихся в db - ratecount1, ratecount2, ratecount3, ratecount4, ratecount5На основе этих значений выводится процентное соотношение каждого из значений

288
barba js - как сделать наложение переходов

barba js - как сделать наложение переходов

Как реализовать наложение переходов в плагине barba js? В примерах на оф сайте, только когда один исчезает, а второй проявляется, а мне нужно что...

313