- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在摆弄 Silverlight 的 TCP 通信,我被迫使用 System.Net.Sockets.Socket 类,它在 Silverlight 运行时只有异步方法。
我想知道如果两个线程在很短的时间内彼此调用 Socket 实例上的 SendAsync 会发生什么情况?
我唯一担心的是不要让混合字节通过 TCP channel 。
作为一个异步方法我想消息被放置在一个队列中,单个线程从该队列中出队,所以不会发生这样的事情(混合在线消息的内容)。
但我不确定,MSDN 没有在方法描述中说明任何内容。有人确定吗?
EDIT1:不,在调用 SendAsync 之前锁定对象,例如:
lock(this._syncObj)
{
this._socket.SendAsync(arguments);
}
将无济于事,因为这会序列化发送数据的请求,而不是实际发送的数据。
最佳答案
为了调用 SendAsync
,您首先需要使用 SocketAsyncEventArgs
的实例调用 ConnectAsync
。它是 SocketAsyncEventArgs
的实例,表示客户端和服务器之间的连接。使用刚刚用于对 SendAsync
的未完成调用的相同 SocketAsyncEventArgs
实例调用 SendAsync
将导致异常。
可以对同一 Socket
对象的 SendAsync
进行多次未完成调用,但只能使用 SocketAsyncEventArgs
的不同实例。例如(在平行宇宙中,这可能是必要的)您可以同时向同一服务器发送多个 HTTP 帖子,但连接不同。这是完全可以接受的,正常情况下客户端和服务器都不会混淆哪个数据包是哪个。
关于silverlight - Socket.SendAsync 线程安全有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1443531/
我是一名优秀的程序员,十分优秀!