Socket.SendAsync线程安全有效吗?

时间:2009-09-18 09:45:11

标签: silverlight asynchronous tcp thread-safety communication

我正在摆弄Silverlight的TCP通信,我被迫使用System.Net.Sockets.Socket类,它在Silverlight运行时只有异步方法。

我想知道如果两个线程在很短的时间内在另一个Socket实例上调用SendAsync会发生什么?

我唯一担心的是没有通过TCP通道的混合字节。

作为异步方法我认为将消息放入队列中,单个线程从该队列中出列,因此不会发生这样的事情(在线路上混合消息的内容)。

但我不确定,MSDN没有在方法描述中说明任何内容。有人肯定吗?

EDIT1:不,在调用SendAsync之前锁定对象,例如:

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

无效,因为这会将发送数据的请求序列化,而不是实际发送的数据。

1 个答案:

答案 0 :(得分:6)

要调用SendAsync,首先需要使用ConnectAsync的实例调用SocketAsyncEventArgs。它是SocketAsyncEventArgs的实例,它表示客户端和服务器之间的连接。使用刚刚用于SendAsync未完成调用的SocketAsyncEventArgs实例调用SendAsync将导致异常。

可以对同一SendAsync个对象的Socket进行多次未完成的调用,但只能使用SocketAsyncEventArgs的不同实例。例如(在并行的宇宙中,这可能是必要的)你可以在同一时间但在不同的连接上向同一服务器发送多个HTTP帖子。这是完全可以接受的,正常情况下客户端和服务器都不会混淆哪个数据包是哪个。