Dab*_*ons 11 c# sockets io asynchronous thread-safety
考虑一下Socket.BeginSend()
方法.如果两个线程池线程同时调用此方法,它们各自的消息是否最终会相互混合,或者socket类是否阻止这种情况发生?
小智 15
.NET Socket实例不是线程安全的,因为同时调用某些方法(相同或不同的方法)可能会导致状态不一致.但是,这些BeginSend()
和BeginReceive()
方法对于它们自身是线程安全的.
对每个(或两个)进行多次未完成的呼叫是安全的.
在这种情况下BeginReceive()
,当数据在被调用的订单中可用时,它们将被服务.例如,如果您的处理过长但希望尽快发生其他接收,则此功能非常有用.当然,在这种情况下,您可能会让代码同时处理多个收据,您可能需要自己的同步逻辑来保护您的应用程序状态.
在这种情况下BeginSend()
,每次调用都会尝试将发送的数据推送到套接字缓冲区,一旦在那里接受,就会调用你的回调(你将调用的地方EndSend()
).如果任何调用的缓冲区空间不足,它将阻塞.
注意:不要假设默认的8k缓冲区意味着"我可以快速调用BeginSend()
8k数据,然后它将阻塞",如下所示:
8K是"标称大小"数字,缓冲区可能会缩小并有所增长
当您排队等待8K的呼叫时,将在网络上发送数据,减少8K的排队数据
一般来说:
如果您BeginSend()
在一个线程中多次调用,则可以确保发送将按照调用它们的顺序离开机器.
如果BeginSend()
从多个线程调用,除非使用其他阻塞机制强制实际调用以某种特定顺序发生,否则无法保证顺序.然而,每个呼叫将在一个连续的网络字节流中正确地发送其数据.
归档时间: |
|
查看次数: |
4716 次 |
最近记录: |