sdefrfg 发表于 2021-7-15 14:53

shinzero 发表于 2021-7-15 15:21

NetworkStream.Read()不是non-blocking的,socket没数据的时候NetworkStream.Read()不会立刻return 0,而是一直block住到timeout
用NetworkStream.DataAvailable 做判断条件

有问题先看文档
https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.networkstream.read?view=net-5.0#System_Net_Sockets_NetworkStream_Read_System_Byte___System_Int32_System_Int32_

abcbuzhiming 发表于 2021-7-15 15:22

sdefrfg 发表于 2021-7-15 15:26

sdefrfg 发表于 2021-7-15 15:30

sblnrrk 发表于 2021-7-15 15:31

abcbuzhiming 发表于 2021-7-15 15:49

Damenly 发表于 2021-7-15 16:27

本帖最后由 Damenly 于 2021-7-15 16:30 编辑

buffer是在内存里的,几十个客户端也不会吃内存,所以应该不是磁盘的问题。 固定下每个client发的数据大小看看?非csharp程序员,还有如果真如楼上所说这个read是blocking有一定timeout了,我都怀疑是不是这个read 是不是busy waiting,文档一句没写

shinzero 发表于 2021-7-15 16:33

前面没注意到你就是要block

你用的是Task.Run(),它不一定会开新线程,很有可能你好几个客户端连接的task是在同一个线程里处理的。
一个task在Read这里block了,是否会马上切换到下一个task,我不清楚

hourousha 发表于 2021-7-15 23:30

EraserKing 发表于 2021-7-16 00:16

hourousha 发表于 2021-7-15 23:30
没记错的话.net core里l的异步tcp在linux中是用epoll实现的,其他怎么实现不清楚。也许实现的有问题,还是 ...

我觉得Task有问题的可能性还是比较大啊

这个Task内部的方法是阻塞的,而且执行时间很长
Task的背后是线程池,同时执行的数量是有上限的,系统自动控制
这里应该设置成Long running,具体有什么用我倒是忘了

其实这边我建议用Thread手动控制线程,既然想要一一对应
Task内部有很多东西是看不出来的

— from Xiaomi MIX 2S, Android 10 of S1 Next Goose v2.4.4.1

shinzero 发表于 2021-7-16 00:28

感觉是到线程池数量上限了,前面的task都block住了,线程让不出来,新的task都queue住了

https://www.cloudsavvyit.com/p/uploads/2020/08/60467b28.png

sdefrfg 发表于 2021-7-16 00:56

sdefrfg 发表于 2021-7-16 01:05

commanderyuri 发表于 2021-7-16 10:01

zxlice 发表于 2021-7-16 10:20

长运行为什么不用 线程 wait awake 的机制?

hourousha 发表于 2021-7-16 14:33

EraserKing 发表于 2021-7-16 17:43

hourousha 发表于 2021-7-16 14:33
线程池耗尽的问题,可以某种意义上用LongRunning的TaskCreateOption来解决。
但这本身并不是解决这个(多 ...

我只是说Task的问题
他这么写和网络没关系,只要是有大量Task就会遇到

— from Xiaomi MIX 2S, Android 10 of S1 Next Goose v2.4.4.1

d2loader 发表于 2021-7-16 20:24

为啥不异步呢

sdefrfg 发表于 2021-7-16 20:57

hourousha 发表于 2021-7-16 23:40

DTCPSS 发表于 2021-7-16 23:46

IO不异步,天理难容…

sdefrfg 发表于 2021-7-16 23:56

页: [1]
查看完整版本: c# 求助,TCP服务器性能问题