And*_*nea 3 silverlight asynchronous tcp communication thread-safety
我正在摆弄Silverlight的TCP通信,我被迫使用System.Net.Sockets.Socket类,它在Silverlight运行时只有异步方法.
我想知道如果两个线程在很短的时间内在另一个Socket实例上调用SendAsync会发生什么?
我唯一担心的是没有通过TCP通道的混合字节.
作为一个异步方法,我认为消息被放置在一个队列中,单个线程从该队列中出列,因此不会发生这样的事情(在线路上混合消息的内容).
但我不确定,MSDN没有在方法的描述中说明任何内容.有人确定吗?
EDIT1:不,在调用SendAsync之前锁定对象,例如:
lock(this._syncObj)
{
this._socket.SendAsync(arguments);
}
Run Code Online (Sandbox Code Playgroud)
因为这会序列化发送数据的请求而不是实际发送的数据,所以无济于事.
为了调用SendAsync你需要首先调用ConnectAsync一个实例SocketAsyncEventArgs.其实例SocketAsyncEventArgs表示客户端和服务器之间的连接.调用SendAsync具有相同的实例SocketAsyncEventArgs刚刚被用于一个优秀的调用SendAsync会导致异常.
可以对SendAsync同一个Socket对象进行多次未完成的调用,但只能使用不同的实例SocketAsyncEventArgs.例如(在并行的宇宙中,这可能是必要的)你可以在同一时间但在不同的连接上向同一服务器发送多个HTTP帖子.这是完全可以接受的,正常客户和服务器都不会混淆哪个数据包是哪个.
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |