今天使用 MQTT 模拟数据发送报文到指定的端口上,代码里面有个地方用了 while loop 确保生成多个 TcpClient 监听 6300 端口,发现一个奇怪的事情,如下图:


目前,一切顺利,不过等等?为什么这个控制台打印语句只运行了一次??? 之后我把 client 的变量拿到了 while loop 的外面,导致 CPU 占用飙升...


这是我今天遇到的最邪门的事情了...
|  |      1aragakiyuii      2022-09-14 07:16:23 +08:00 via iPhone  1 accept 这种方法应该都会阻塞当前线程的吧 | 
|  |      2PendingOni OP @aragakiyuii 说到点子上了 | 
|  |      3PendingOni OP 那一行感觉是在等待数据包的传入所以可能会阻塞当前的线程... | 
|  |      4PendingOni OP | 
|      5thinkershare      2022-09-14 08:02:45 +08:00 这个玩意那里邪门了? 本来就是这样设计的 | 
|  |      6PendingOni OP @thinkershare 当时确实觉得邪门 | 
|      7Jirajine      2022-09-14 08:40:54 +08:00 显然 accept 调用的时候阻塞等待了,至于拿到外面去,死循环里空转,可不就 CPU 飙升么。 | 
|      8lixingcong      2022-09-14 09:20:39 +08:00 7 楼 Jirajine 说得对,不光是 C#,别的语言都是这么设计的 accept 阻塞。 | 
|  |      9Eiden      2022-09-14 09:22:45 +08:00 mqttnet 不好用吗 | 
|  |      10PendingOni OP @lixingcong 主要还是 Socket 就是这么设计的 | 
|  |      11timethinker      2022-09-14 09:33:53 +08:00  1 C#的 Socket 光是异步的写法目前就有 3 种编程模型: APM:即 BeginXXX 和 EndXXX 配对使用的异步编程模型。 EAP:即基于事件的异步模式,也就是使用 SocketAsyncEventArgs 配合 Socket 的 XXXAsync 系列方法使用。 TAP:既基于任务的异步模式,最新的使用方法,不再需要 SocketAsyncEventArgs ,直接返回 Task/ValueTask 配合异步上下文使用 await/async 语法。 | 
|  |      12nba2k9      2022-09-14 09:46:27 +08:00 对不起问一下楼主用的是什么字体,挺好看的 | 
|  |      13PendingOni OP | 
|  |      14VictorJing94      2022-09-14 10:06:02 +08:00 while loop...死循环不带休眠时间.... |