Эффективно ли защищен поток Socket.SendAsync? - PullRequest
3 голосов
/ 18 сентября 2009

Я возился с TCP-связью Silverlight и был вынужден использовать класс System.Net.Sockets.Socket, который во время выполнения Silverlight имеет только асинхронные методы.

Мне было интересно, что произойдет, если два потока вызовут SendAsync для экземпляра Socket в очень короткое время один из другого?

Мое единственное беспокойство заключается в том, чтобы не смешивать байты, проходящие через канал TCP.

Будучи асинхронным методом Полагаю, сообщение помещается в очередь, из которой исключается один поток, поэтому никаких подобных вещей не произойдет (перемешивание содержимого сообщения в сети).

Но я не уверен, и MSDN ничего не указывает в описании метода. Кто-нибудь уверен в этом?

EDIT1: Нет, блокировка объекта перед вызовом SendAsync, например:

lock(this._syncObj)
{
    this._socket.SendAsync(arguments);
}

не поможет, поскольку при этом сериализуются запросы на отправку данных, а не фактически отправленных данных.

1 Ответ

6 голосов
/ 18 сентября 2009

Чтобы вызвать SendAsync, сначала нужно позвонить ConnectAsync с экземпляром SocketAsyncEventArgs. Это экземпляр SocketAsyncEventArgs, представляющий соединение между клиентом и сервером. Вызов SendAsync с тем же экземпляром SocketAsyncEventArgs, который только что использовался для ожидающего вызова на SendAsync, приведет к исключению.

Можно сделать несколько ожидающих вызовов к SendAsync одного и того же объекта Socket, но только с использованием разных экземпляров SocketAsyncEventArgs. Например (в параллельном юниверсе, где это может потребоваться), вы можете отправлять несколько сообщений HTTP на один и тот же сервер одновременно, но на разных соединениях. Это вполне приемлемо, и обычно ни клиент, ни сервер не запутаются в том, какой пакет какой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...