C#无while(true)循环的非阻塞套接字

C#无while(true)循环的非阻塞套接字,c#,sockets,while-loop,nonblocking,C#,Sockets,While Loop,Nonblocking,我只是想做一些套接字编程,在c#中使用非阻塞套接字。 我发现的各种示例,例如,似乎使用了while(true)循环,但这种方法会导致cpu以100%的速度崩溃。 是否有一种使用事件编程风格的非阻塞套接字的方法? 感谢您概括地谈论阻塞/非阻塞IO,通常适用于: 关键是,在现实生活中,您的程序在不执行IO的情况下执行其他操作。这些例子都是这样设计的 在阻塞IO时,线程在等待IO时“阻塞”。操作系统去做其他事情,例如允许其他线程运行。因此,您的应用程序可以通过使用多个线程并行完成许多事情(概念上) 在

我只是想做一些套接字编程,在c#中使用非阻塞套接字。 我发现的各种示例,例如,似乎使用了while(true)循环,但这种方法会导致cpu以100%的速度崩溃。 是否有一种使用事件编程风格的非阻塞套接字的方法?
感谢您

概括地谈论阻塞/非阻塞IO,通常适用于:

关键是,在现实生活中,您的程序在不执行IO的情况下执行其他操作。这些例子都是这样设计的

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


在非阻塞IO中,线程查询IO是否可行,否则将执行其他操作。因此,您可以通过在应用程序级别显式地在它们之间交换来并行完成许多事情。

Socket.BeginReceive和AsyncCallback

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

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


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

以避免在没有数据接收时,while循环中出现CPU问题put
thread.sleep(100)
或更少。这将让其他进程改变以完成其任务

这个答案给出了一些理论,解释了为什么要执行非阻塞IO,但并没有真正回答海报上关于如何实现它的问题。