Как через 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
var finished = socket.DisconnectAsync(args);
if (finished)
{
// операция завершилась синхронно, просто выходим
return Task.Completed;
}
return tcs.Task;
}
Использование:
await socket.DisconnectAsync(args);
Комментариев нет:
Отправить комментарий