C#非阻塞套接字没有while(true)循环

时间:2009-11-03 07:42:21

标签: c# sockets while-loop nonblocking

我只是尝试使用c#中的非阻塞套接字进行一些套接字编程。 我发现的各种样本,例如this,似乎使用了一个while(true)循环,但是这种方法导致cpu以100%的速度突发。 有没有办法使用事件编程风格的非阻塞套接字? 感谢

4 个答案:

答案 0 :(得分:8)

请参阅MSDN示例here。该示例显示了如何异步接收数据。您还可以使用Socket BeginSend / EndSend方法异步发送数据。

您应该注意回调委托在ThreadPool线程的上下文中执行。如果在回调内接收的数据需要与另一个线程共享,这是很重要的,例如,以Windows形式显示数据的主UI线程。如果是这样,您将需要使用lock关键字同步访问数据,例如。

正如您所注意到的,使用非阻塞套接字和while循环,处理器固定为100%。异步模型只在有数据要发送或接收时调用回调委托。

答案 1 :(得分:4)

为了避免在繁重的while循环中出现CPU问题,当没有数据接收时放置thread.sleep(100)或更少。这将让其他流程改变以完成他们的任务

答案 2 :(得分:3)

一般性地讨论阻塞/非阻塞IO,一般适用:

关键是在现实生活中你的程序其他东西而不做IO。这些例子都是以这种方式设计的。

在阻止IO时,您的线程在等待IO时“阻塞”。操作系统去做其他事情,例如允许其他线程运行。因此,您的应用程序可以通过使用许多线程并行地(概念上)执行许多操作。

在非阻塞IO中,您的线程会查询IO是否可行,否则会执行其他操作。因此,您可以通过显式地 - 在应用程序级别 - 并行交换来并行执行许多操作。

答案 3 :(得分:0)

Socket.BeginReceive和AsyncCallback