我在修改silverlight的tcp通信,被迫使用system.net.socket s.socket类,在silverlight运行时,该类只有异步方法。
我想知道如果两个线程在很短的时间内调用一个套接字实例上的sendaync,会发生什么?
我唯一担心的是没有混合字节通过TCP通道。
作为一个异步方法,我假设消息被放置在一个队列中,从这个队列中一个线程出列,这样就不会发生这样的事情(将消息的内容混合在一起)。
但我不确定,而且msdn没有在方法的描述中声明任何内容。有人确定吗?
edit1:否,在调用sendaync之前锁定对象,例如:

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

不会有帮助,因为这会序列化发送数据的请求,而不是实际发送的数据。

最佳答案

要调用SendAsync,首先需要使用ConnectAsync的实例调用SocketAsyncEventArgs。它是SocketAsyncEventArgs的实例,表示客户机和服务器之间的连接。使用刚才用于未完成的调用SendAsync的相同实例调用SocketAsyncEventArgs将导致异常。
可以对同一对象的SendAsync进行多个未完成调用,但只能使用SendAsync的不同实例。例如(在一个可能需要这样做的并行世界中),您可以同时向同一服务器发送多个http帖子,但在不同的连接上。这是完全可以接受和正常的,客户机和服务器都不会混淆哪个包是哪个包。

关于silverlight - Socket.SendAsync线程安全有效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1443531/

10-10 14:38