Как через async\await вызвать метод DisconnectAsync и дождаться его завершения у сокета? Этот метод не поддерживает TAP паттерн. Он поддерживает только старые асинхронные паттерны, с которыми я плохо знаком.
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);
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники