Веб-сокет.ReceiveAsync — как использовать переопределение задачи ValueTask?

#c# #.net #websocket

Вопрос:

ReceiveAsync Метод имеет 2 версии, одна из которых возвращается Task<WebSocketReceiveResult> , а другая возвращается ValueTask<ValueWebSocketReceiveResult> .

Первый принимает ArraySegment<byte> в качестве аргумента, второй принимает Memory<byte> .

Какой из них лучше? Я бы выбрал второй, так как Memory<T> он более новый и более быстрый, чем ArraySegment<T> . Однако возвращаемые значения отличаются.

ValueWebSocketReceiveResult пропускает CloseStatus и CloseStatusDescription необходим для правильного обращения с заключительным рукопожатием. Как получить эти значения со второй версией?

Стоит ли это того? Это значительно быстрее или лучше в любом случае?

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

1. Мне не сразу понятно, почему эти свойства существуют как для типа результата, так и для самого сокета. Являются ли те, что находятся в сокете (которые существуют независимо от того, какой тип результата вы получаете), неадекватными?

2. @Damien_The_Unbeliever, БОЖЕ, спасибо! Я смотрю на код и не вижу его на виду, конечно, они в порядке, я просто забыл о них. Я посмотрел на фрагмент кода, который хотел переработать, и мне было интересно, куда они делись 😉 Кстати, мой рефакторинг заключается в том, чтобы изолировать транспорт от обработки данных, и перемещение этих свойств ближе к транспортному уровню (сокету) — это правильный путь.

3. Более того, на Close свойства (из WebSocketReceiveResult ) в моем коде не было ссылок, я просто удалил их, и все тесты (например, 20 из них, включая множество крайних случаев) проходят как ни в чем не бывало.