我在修改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/