[疑惑]-C#中一个奇怪的现象

2022-09-14 06:25:16 +08:00
 PendingOni

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

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

这是我今天遇到的最邪门的事情了...

2377 次点击
所在节点    程序员
14 条回复
aragakiyuii
2022-09-14 07:16:23 +08:00
accept 这种方法应该都会阻塞当前线程的吧
PendingOni
2022-09-14 07:26:01 +08:00
@aragakiyuii 说到点子上了
PendingOni
2022-09-14 07:34:02 +08:00
那一行感觉是在等待数据包的传入所以可能会阻塞当前的线程...
PendingOni
2022-09-14 07:41:31 +08:00
thinkershare
2022-09-14 08:02:45 +08:00
这个玩意那里邪门了? 本来就是这样设计的
PendingOni
2022-09-14 08:03:37 +08:00
@thinkershare 当时确实觉得邪门
Jirajine
2022-09-14 08:40:54 +08:00
显然 accept 调用的时候阻塞等待了,至于拿到外面去,死循环里空转,可不就 CPU 飙升么。
lixingcong
2022-09-14 09:20:39 +08:00
7 楼 Jirajine 说得对,不光是 C#,别的语言都是这么设计的 accept 阻塞。
Eiden
2022-09-14 09:22:45 +08:00
mqttnet 不好用吗
PendingOni
2022-09-14 09:22:46 +08:00
@lixingcong 主要还是 Socket 就是这么设计的
timethinker
2022-09-14 09:33:53 +08:00
C#的 Socket 光是异步的写法目前就有 3 种编程模型:

APM:即 BeginXXX 和 EndXXX 配对使用的异步编程模型。
EAP:即基于事件的异步模式,也就是使用 SocketAsyncEventArgs 配合 Socket 的 XXXAsync 系列方法使用。
TAP:既基于任务的异步模式,最新的使用方法,不再需要 SocketAsyncEventArgs ,直接返回 Task/ValueTask 配合异步上下文使用 await/async 语法。
nba2k9
2022-09-14 09:46:27 +08:00
对不起问一下楼主用的是什么字体,挺好看的
PendingOni
2022-09-14 09:54:58 +08:00
@nba2k9
Rider 主题:Kuro
Rider 字体:Fira Code 15 号大小 开启 ligature 显示模式
没什么对不起的.
VictorJing94
2022-09-14 10:06:02 +08:00
while loop...死循环不带休眠时间....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879857

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX