今天使用 MQTT 模拟数据发送报文到指定的端口上,代码里面有个地方用了 while loop 确保生成多个 TcpClient 监听 6300 端口,发现一个奇怪的事情,如下图:
目前,一切顺利,不过等等?为什么这个控制台打印语句只运行了一次??? 之后我把 client 的变量拿到了 while loop 的外面,导致 CPU 占用飙升...
这是我今天遇到的最邪门的事情了...
1
aragakiyuii 2022-09-14 07:16:23 +08:00 via iPhone 1
accept 这种方法应该都会阻塞当前线程的吧
|
2
PendingOni OP @aragakiyuii 说到点子上了
|
3
PendingOni OP 那一行感觉是在等待数据包的传入所以可能会阻塞当前的线程...
|
4
PendingOni OP |
5
thinkershare 2022-09-14 08:02:45 +08:00
这个玩意那里邪门了? 本来就是这样设计的
|
6
PendingOni OP @thinkershare 当时确实觉得邪门
|
7
Jirajine 2022-09-14 08:40:54 +08:00
显然 accept 调用的时候阻塞等待了,至于拿到外面去,死循环里空转,可不就 CPU 飙升么。
|
8
lixingcong 2022-09-14 09:20:39 +08:00
7 楼 Jirajine 说得对,不光是 C#,别的语言都是这么设计的 accept 阻塞。
|
9
Eiden 2022-09-14 09:22:45 +08:00
mqttnet 不好用吗
|
10
PendingOni OP @lixingcong 主要还是 Socket 就是这么设计的
|
11
timethinker 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 语法。 |
12
nba2k9 2022-09-14 09:46:27 +08:00
对不起问一下楼主用的是什么字体,挺好看的
|
13
PendingOni OP |
14
VictorJing94 2022-09-14 10:06:02 +08:00
while loop...死循环不带休眠时间....
|