线程的结束

qq_37357225 2018-06-10 10:44:25
不知道今天有没回答问题没有,遇到一个问题,我洗了五个线程,都是用Thread。start()开始线程,没有相关的线程结束代码,然后发到IIS上 会报错,w3wp.exe 未处理的异常什么的,找原因之后好像是因为我把线程写在页面上,用户量过多之后线程没有结束,导致用户拥堵照成的,请问大佬该如何正确的结束线程,难道不是运行完代码自动结束的吗
...全文
1577 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
BXS_null 2018-06-20
  • 打赏
  • 举报
回复
项目经理又说之前的逻辑不要动,之前的逻辑确实没啥好弄的,就是一些查询判断之类的
BXS_null 2018-06-20
  • 打赏
  • 举报
回复
引用 37 楼 sp1234 的回复:
跟你“开了几个异步Task”没有直接关系,关键就在于你的 Task 中难道是有 while 循环+阻塞 之类的代码? 一个任务通常几十、几百毫秒就完毕了。你如果弄了上述这种逻辑上的拥堵代码,那就什么办法都不行了。
正常不用线程之类的,几毫秒到三百毫秒之间能完成一个用户的访问,但是客户说这个速度太慢,要加快速度
BXS_null 2018-06-20
  • 打赏
  • 举报
回复
引用 38 楼 sp1234 的回复:
不管怎么说技术,最怕的都是刻意地滥用技术。线程(或者是这里说 异步 Task 任务)应该瞬间就用完,就怕有人抱着“死循环、随便开”的思路去编程。
task之中就是访问其他地址接收返回值,其他没有什么
  • 打赏
  • 举报
回复
不管怎么说技术,最怕的都是刻意地滥用技术。线程(或者是这里说 异步 Task 任务)应该瞬间就用完,就怕有人抱着“死循环、随便开”的思路去编程。
  • 打赏
  • 举报
回复
跟你“开了几个异步Task”没有直接关系,关键就在于你的 Task 中难道是有 while 循环+阻塞 之类的代码? 一个任务通常几十、几百毫秒就完毕了。你如果弄了上述这种逻辑上的拥堵代码,那就什么办法都不行了。
BXS_null 2018-06-20
  • 打赏
  • 举报
回复
引用 35 楼 hanjun0612 的回复:
[quote=引用 31 楼 weixin_40068689 的回复:] [quote=引用 25 楼 weixin_40068689 的回复:] [quote=引用 24 楼 hanjun0612 的回复:] [quote=引用 23 楼 weixin_40068689 的回复:] 感谢感谢 ,刚刚看了下完全可以用task
恩,可以用就好了[/quote]还有个问题想问下。如果使用异步task的话,也能达到线程的效果吧?[/quote] 如果使用线程池的话是不是必须设置线程池的大小?不然就没用??这些以前都没用过 还是小菜鸟[/quote] 不设置也可以,因为有默认设置的。[/quote]用线程池没用 用户多了 还是不行,再试试异步吧。 我就是想问一下,一个用户过来我就开了五个异步task,如果10个用户同时过来就开了50个task,这样成倍的增长对服务器影响大吗
wanghui0380 2018-06-20
  • 打赏
  • 举报
回复
Task之中就是访问其他地址接收返回值,其他没有什么。这里当然有问题。 问题在于微软对httpcient,resquest一类的东西封装的其实的确有问题,这个问题很早就被俺们吐槽过了 你可以自己去百度“httpcient内存溢出”
wanghui0380 2018-06-20
  • 打赏
  • 举报
回复
关键是IIS的线程有什么用。如果是webapi,你应该熟悉async task 如果是aspx,请想一下。他到底是怎么样的执行顺序? 另外iis会自己“无意识”的自动重启,请问你到底要怎么样?? 既然你说300毫秒就会结束,那么你在纠结什么? ---------------------------- 我看服务器上的windows日志里面的报错说的是什么什么内存不住,就是因为用户量过多导致线程过多然后导致的内存不足吧? 内存不足,通常的原因不是“内存不足?你300毫秒就能结束的东西,有多大并发才会把4G用完?其实内存不足更多的情况是,分配了大对象,而微软对大对象的管理机制不一样,gc对大对象处理比较“郁闷”,所以不是内存不足,而是大对象造成内存碎片过多,没有另外的平坦空间在分配给下一个大对象
  • 打赏
  • 举报
回复
既然你说300毫秒就会结束,那么就不用纠结这个问题。这个你可以写日志,在任务结束之前判断一下用了多少秒,超过1秒的就记录日志,报告有bug存在。如果确信所有操作都在300毫秒内完成,那么你就应该去找其它原因去了。
正怒月神 2018-06-19
  • 打赏
  • 举报
回复
引用 31 楼 weixin_40068689 的回复:
[quote=引用 25 楼 weixin_40068689 的回复:] [quote=引用 24 楼 hanjun0612 的回复:] [quote=引用 23 楼 weixin_40068689 的回复:] 感谢感谢 ,刚刚看了下完全可以用task
恩,可以用就好了[/quote]还有个问题想问下。如果使用异步task的话,也能达到线程的效果吧?[/quote] 如果使用线程池的话是不是必须设置线程池的大小?不然就没用??这些以前都没用过 还是小菜鸟[/quote] 不设置也可以,因为有默认设置的。
xuzuning 2018-06-16
  • 打赏
  • 举报
回复
自己管理线程,或多或少会出现些问题。因为你不是专业的 线程池是线程管理工具(并非简单的线程集合) Task 是基于线程池的并行任务(Parallel 是基于多核的并行处理) 你的问题应该是子线程未随主线程的结束而结束,并在子线程中访问了已经结束的主线程成员
BXS_null 2018-06-16
  • 打赏
  • 举报
回复
引用 25 楼 weixin_40068689 的回复:
[quote=引用 24 楼 hanjun0612 的回复:] [quote=引用 23 楼 weixin_40068689 的回复:] 感谢感谢 ,刚刚看了下完全可以用task
恩,可以用就好了[/quote]还有个问题想问下。如果使用异步task的话,也能达到线程的效果吧?[/quote] 如果使用线程池的话是不是必须设置线程池的大小?不然就没用??这些以前都没用过 还是小菜鸟
BXS_null 2018-06-16
  • 打赏
  • 举报
回复
引用 11 楼 hanjun0612 的回复:
你意思是每个用户进入都会创建5个线程嘛? 应该改用线程池来做这个事情。
还有一些问题想问一下,我现在写的是一个用户过来就是开了五个task,如果多个用户同事访问的话那不就是成倍数增长?这样又影响吗?还有个问题,如果使用线程池的话能解决之前的问题吗?我把程序的五个线程都放在线程池里面
BXS_null 2018-06-16
  • 打赏
  • 举报
回复
引用 32 楼 xuzuning 的回复:
自己管理线程,或多或少会出现些问题。因为你不是专业的 线程池是线程管理工具(并非简单的线程集合) Task 是基于线程池的并行任务(Parallel 是基于多核的并行处理) 你的问题应该是子线程未随主线程的结束而结束,并在子线程中访问了已经结束的主线程成员
引用 32 楼 xuzuning 的回复:
自己管理线程,或多或少会出现些问题。因为你不是专业的 线程池是线程管理工具(并非简单的线程集合) Task 是基于线程池的并行任务(Parallel 是基于多核的并行处理) 你的问题应该是子线程未随主线程的结束而结束,并在子线程中访问了已经结束的主线程成员
我看服务器上的windows日志里面的报错说的是什么什么内存不住,就是因为用户量过多导致线程过多然后导致的内存不足吧?
BXS_null 2018-06-16
  • 打赏
  • 举报
回复
引用 32 楼 xuzuning 的回复:
自己管理线程,或多或少会出现些问题。因为你不是专业的 线程池是线程管理工具(并非简单的线程集合) Task 是基于线程池的并行任务(Parallel 是基于多核的并行处理) 你的问题应该是子线程未随主线程的结束而结束,并在子线程中访问了已经结束的主线程成员
嗯 我写线程的地方确实是个子线程,不过逻辑上好像没调主线程的东西啊
BXS_null 2018-06-13
  • 打赏
  • 举报
回复
引用 27 楼 hfjcloud 的回复:
[quote=引用 22 楼 weixin_40068689 的回复:] [quote=引用 21 楼 hanjun0612 的回复:] [quote=引用 19 楼 weixin_40068689 的回复:] [quote=引用 17 楼 hanjun0612 的回复:] [quote=引用 14 楼 weixin_40068689 的回复:] [quote=引用 11 楼 hanjun0612 的回复:] 你意思是每个用户进入都会创建5个线程嘛? 应该改用线程池来做这个事情。
还有个疑问,我现在是把线程写在一个aspx.cs里面作为一个地址给别人调用,如果我直接写在webapi里面会有什么不同吗,就是说还会不会出现这种界面等待的状态[/quote] 除非你使用异步创建线程。如果线程做的事情并不影响返回结果,那么可以直接返回,用户不用等待,线程在后台慢慢自己跑。 否则的话,无论是webapi还是 mvc的web页面,都需要等待服务器的响应。[/quote]我线程里面做的事情是把客户传过来的数据访问五个其他地方的地址之后 获取访问地址给我返回的值做一些处理之后再传到另一个服务器的数据库。。。[/quote] 你这个就比较简单了。 直接使用异步task就可以了。使他们分别异步访问5个地址,等到waitall所有task完成后。 就可以返回结果了。 [/quote]我现在是访问一个地址就给他返回一个结果,返回五次,异步task没用过,待会去看看。[/quote] 我觉得你这样的做法和没用线程差不多的么,怎么才能做到分五次返回给页面五个结果?[/quote]五个线程分别给数据库传入不同的数据
token不能为空 2018-06-13
  • 打赏
  • 举报
回复
没必要每次回复引用这么一大串话吧。
正怒月神 2018-06-11
  • 打赏
  • 举报
回复
引用 23 楼 weixin_40068689 的回复:
感谢感谢 ,刚刚看了下完全可以用task
恩,可以用就好了
BXS_null 2018-06-11
  • 打赏
  • 举报
回复
引用 21 楼 hanjun0612 的回复:
[quote=引用 19 楼 weixin_40068689 的回复:] [quote=引用 17 楼 hanjun0612 的回复:] [quote=引用 14 楼 weixin_40068689 的回复:] [quote=引用 11 楼 hanjun0612 的回复:] 你意思是每个用户进入都会创建5个线程嘛? 应该改用线程池来做这个事情。
还有个疑问,我现在是把线程写在一个aspx.cs里面作为一个地址给别人调用,如果我直接写在webapi里面会有什么不同吗,就是说还会不会出现这种界面等待的状态[/quote] 除非你使用异步创建线程。如果线程做的事情并不影响返回结果,那么可以直接返回,用户不用等待,线程在后台慢慢自己跑。 否则的话,无论是webapi还是 mvc的web页面,都需要等待服务器的响应。[/quote]我线程里面做的事情是把客户传过来的数据访问五个其他地方的地址之后 获取访问地址给我返回的值做一些处理之后再传到另一个服务器的数据库。。。[/quote] 你这个就比较简单了。 直接使用异步task就可以了。使他们分别异步访问5个地址,等到waitall所有task完成后。 就可以返回结果了。 [/quote]感谢感谢 ,刚刚看了下完全可以用task
BXS_null 2018-06-11
  • 打赏
  • 举报
回复
引用 21 楼 hanjun0612 的回复:
[quote=引用 19 楼 weixin_40068689 的回复:] [quote=引用 17 楼 hanjun0612 的回复:] [quote=引用 14 楼 weixin_40068689 的回复:] [quote=引用 11 楼 hanjun0612 的回复:] 你意思是每个用户进入都会创建5个线程嘛? 应该改用线程池来做这个事情。
还有个疑问,我现在是把线程写在一个aspx.cs里面作为一个地址给别人调用,如果我直接写在webapi里面会有什么不同吗,就是说还会不会出现这种界面等待的状态[/quote] 除非你使用异步创建线程。如果线程做的事情并不影响返回结果,那么可以直接返回,用户不用等待,线程在后台慢慢自己跑。 否则的话,无论是webapi还是 mvc的web页面,都需要等待服务器的响应。[/quote]我线程里面做的事情是把客户传过来的数据访问五个其他地方的地址之后 获取访问地址给我返回的值做一些处理之后再传到另一个服务器的数据库。。。[/quote] 你这个就比较简单了。 直接使用异步task就可以了。使他们分别异步访问5个地址,等到waitall所有task完成后。 就可以返回结果了。 [/quote]我现在是访问一个地址就给他返回一个结果,返回五次,异步task没用过,待会去看看。
加载更多回复(24)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧