c#.net的socket的blocking属性为true时有什么效果?
就是说blocking属性为true,看到MSDN解释是“处于阻止模式”,请讲一下阻止模式及相关知识,先谢过了。...
就是说blocking属性为true,看到MSDN解释是“处于阻止模式”,请讲一下阻止模式及相关知识,先谢过了。
展开
展开全部
阻止(或阻塞)是指线程挂起等待直到操作完成。例如Receive方法,当没有数据可接受时,这个方法一直挂起等待,直到有数据返回。类似的有Console.ReadLine方法也是阻塞接收数据。你可以稍微调试一下就能发现和普通函数的区别了。
非阻止有几种方式,第一种是采用预先判定,调用一个可确定结果的非阻止方法。例如:
if(socket.DataAvailable){ //预先判定,有数据才调用receive
socket.Receive(...); //有数据,这个方法立即执行
}
第二种是使用异步,把receive方法放到另外一个线程上执行,直到有数据返回。注意这种方法本质上还是阻止的,只不过组止的是另一个线程而非主线程。
第三种方法是使用超时判定,即如果x秒内还没有数据,方法就返回或抛异常:
socket.ReceiveTimeout = 3000; //超时值
try{
socket.Receive(...); //超过三秒还没有数据返回就跑出异常
}catch...
非阻止有几种方式,第一种是采用预先判定,调用一个可确定结果的非阻止方法。例如:
if(socket.DataAvailable){ //预先判定,有数据才调用receive
socket.Receive(...); //有数据,这个方法立即执行
}
第二种是使用异步,把receive方法放到另外一个线程上执行,直到有数据返回。注意这种方法本质上还是阻止的,只不过组止的是另一个线程而非主线程。
第三种方法是使用超时判定,即如果x秒内还没有数据,方法就返回或抛异常:
socket.ReceiveTimeout = 3000; //超时值
try{
socket.Receive(...); //超过三秒还没有数据返回就跑出异常
}catch...
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询