我只是想进行一些套接字编程,在 c# 中使用非阻塞套接字。我发现的各种样本,例如this,似乎使用了 while(true) 循环,但这种方法会导致 cpu 以 100% 的速度爆裂。有没有办法使用事件编程风格使用非阻塞套接字?谢谢
4 回答
请参阅此处的 MSDN 示例。该示例显示了如何异步接收数据。您还可以使用 Socket BeginSend/EndSend 方法异步发送数据。
您应该注意回调委托在 ThreadPool 线程的上下文中执行。如果在回调中接收到的数据需要与另一个线程共享,这很重要,例如,在 Windows 窗体中显示数据的主 UI 线程。如果是这样,您将需要使用关键字同步访问数据lock
。
正如您所注意到的,使用非阻塞套接字和 while 循环,处理器被固定在 100%。异步模型只会在有数据发送或接收时调用回调委托。
为了避免在繁重的 while 循环中出现 CPU 问题,当没有数据接收 putthread.sleep(100)
或更少时。这将让其他进程改变来完成他们的任务
泛谈阻塞/非阻塞IO,一般适用:
关键是,在现实生活中,您的程序在不做 IO 的同时做其他事情。这些例子都是这样设计的。
在阻塞 IO 中,您的线程在等待 IO 时会“阻塞”。操作系统会去做其他事情,例如允许其他线程运行。因此,您的应用程序可以通过使用多个线程并行执行许多事情(概念上)。
在非阻塞 IO 中,您的线程查询以查看 IO 是否可能,否则会去做其他事情。因此,您可以通过在应用程序级别显式地在它们之间进行交换来并行执行许多事情。
Socket.BeginReceive 和 AsyncCallback