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