我正在摆弄Silverlight的TCP通信,我被迫使用System.Net.Sockets.Socket类,它在Silverlight运行时只有异步方法。
我想知道如果两个线程在很短的时间内在另一个Socket实例上调用SendAsync会发生什么?
我唯一担心的是没有通过TCP通道的混合字节。
作为异步方法我认为将消息放入队列中,单个线程从该队列中出列,因此不会发生这样的事情(在线路上混合消息的内容)。
但我不确定,MSDN没有在方法描述中说明任何内容。有人肯定吗?
EDIT1:不,在调用SendAsync之前锁定对象,例如:
lock(this._syncObj)
{
this._socket.SendAsync(arguments);
}
无效,因为这会将发送数据的请求序列化,而不是实际发送的数据。
答案 0 :(得分:6)
要调用SendAsync
,首先需要使用ConnectAsync
的实例调用SocketAsyncEventArgs
。它是SocketAsyncEventArgs
的实例,它表示客户端和服务器之间的连接。使用刚刚用于SendAsync
未完成调用的SocketAsyncEventArgs
实例调用SendAsync
将导致异常。
可以对同一SendAsync
个对象的Socket
进行多次未完成的调用,但只能使用SocketAsyncEventArgs
的不同实例。例如(在并行的宇宙中,这可能是必要的)你可以在同一时间但在不同的连接上向同一服务器发送多个HTTP帖子。这是完全可以接受的,正常情况下客户端和服务器都不会混淆哪个数据包是哪个。