Вопрос

Я возился с 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 на один и тот же сервер одновременно, но на разных соединениях. Это вполне приемлемо, и обычно ни клиент, ни сервер не запутаются в том, какой пакет какой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top