在asp.net写了ashx的服务,cpu消耗很高
后改写到到asp.net core还是一样
最后将action改为异步,以及涉及到的操作全改为异步
cpu占用降下来了,但是新的问题出现了-->一旦有并发大概 --->每次发5个请求,连续发20次,这样服务端就会有500个任务--创建500个任务,每个任务会发送1到6个http请求,各种网站,500个任务,最终可能需要发送2000到3000个请求(百度,腾讯,阿里等等网站)5秒超时
最终导致这个action响应的数据无法回发到客户端,调试的时候action可以正常执行到return,且结果正常,但是客户端就是收不到响应
多种调试排查无果--全部中断查看线程情况--一切正常
后面不知道那一次全部中断发现有任务执行的线程中断,查看对于代码,找到代码块
最后发现在异步方法中使用thread.sleep ,但是线程并没有卡在这里,去掉这个语句改为await task.delay,同时将tcpclient创建多个放在list里面重用(对线程安全无要求)
最后发现提高并发持续发请求不会出现响应被挂起的情况
那么问题来了,具体是什么原因导致的,还是不清楚,为什么会出现action能正常执行完毕并return,但是请求端弄死收到响应,dotnet命令行显示请求执行完毕的时间是随时间一直同步增长,但是实际action都是毫秒级完成的
不仅如此,action响应被挂起后,其他action和其他controller还是能正常请求和响应的
难道线程死锁只锁死了负责某一个action'响应的线程么,不可能啊
一脸懵逼,只知道和线程阻塞有关,需要进一步测试,异步方法中不要出现阻塞代码,一定一定