2009-09-18 3 views
3

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

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

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

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

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

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

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

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

ответ

6

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

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

Смежные вопросы