Эффективно ли защищен поток Socket.SendAsync?
-
22-07-2019 - |
Вопрос
Я возился с TCP-связью Silverlight и был вынужден использовать класс System.Net.Sockets.Socket, который во время выполнения Silverlight имеет только асинхронные методы.
Мне было интересно, что произойдет, если два потока вызовут SendAsync для экземпляра Socket в очень короткое время один из другого?
Мое единственное беспокойство заключается в том, чтобы не смешивать байты, проходящие через канал TCP.
Будучи асинхронным методом , я полагаю , сообщение помещается в очередь, из которой исключается один поток, поэтому никаких таких событий не произойдет (перемешивание содержимого сообщения в сети). Р>
Но я не уверен, и в MSDN ничего не указано в описании метода. Кто-нибудь уверен в этом?
EDIT1: нет, блокировка объекта перед вызовом SendAsync, например:
lock(this._syncObj)
{
this._socket.SendAsync(arguments);
}
не поможет, так как при этом сериализуются запросы на отправку данных, а не фактически отправленных данных.
Решение
Чтобы вызвать SendAsync
, сначала нужно вызвать ConnectAsync
с экземпляром SocketAsyncEventArgs
. Это экземпляр SocketAsyncEventArgs
, который представляет соединение между клиентом и сервером. Вызов SendAsync
с тем же экземпляром SocketAsyncEventArgs
, который только что использовался для ожидающего вызова SendAsync
, приведет к исключению.
Можно выполнить несколько ожидающих вызовов SendAsync
одного и того же объекта Socket
, но только используя разные экземпляры SocketAsyncEventArgs
. Например (в параллельном юниверсе, где это может потребоваться), вы можете отправлять несколько сообщений HTTP на один и тот же сервер одновременно, но на разных соединениях. Это вполне приемлемо, и обычно ни клиент, ни сервер не запутаются в том, какой пакет какой.