Winform程序线程

sj490790083 2018-03-22 04:51:48
偶然发现,一个Winform程序,就算没有任何逻辑代码,启动后进程中就会有十几个线程,其中一个线程运行状态,其余线程处于Wait状态。这是为什么?CLR线程池中分配的线程吗?

还有个问题,在该程序中用Task.Factory.StartNew或者ThreadPool.QueueUserWorkItem进行异步操作,不是应该在线程池中空闲的线程上执行吗?为什么进程中的线程数目会变多,而且状态都是System.Diagnostics.ThreadState.Wait?
...全文
442 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-03-23
  • 打赏
  • 举报
回复
您先搞清楚那些 Wait 的都是些什么! 这里不是培训学校,任何人都没有教会你做人做事的义务
exception92 2018-03-23
  • 打赏
  • 举报
回复
引用 1 楼 xomix 的回复:
这些线程你可以理解为 .net 库与windows桌面交互的一些基本线程。 说两个我知道的: gc,对就是垃圾回收,是由一个程序自己创建线程回收自己的垃圾的,你如果关闭整个程序的资源就会都变成系统垃圾,随时清理。 event实现,是的,事件的实现最后还是用到了一个甚至多个线程来控制,当然这对于使用.net的程序员来说,是你不用考虑的了。 剩下的部分我就没有能马上想到的了,对没错你开一个单线程的窗体程序也会启动很多线程。 至于这些线程的内部机制,那就更不是一两句话能解释清楚的了。
是的,好像自从。net4.0之后,在app启动的时候,GC的回收有专门的后台线程来执行,这样就产生了额外线程;但这不是根本的原因吧,在window中启动exe程序是需要时间的,因为需要分配内存,而且相关联的dll也必须从磁盘或者GAC中加载,这个过程就比较耗时所以就用更多的线程来进行这些初始化操作,以加快程序启动,个人理解。
  • 打赏
  • 举报
回复
引用 9 楼 duanzi_peng 的回复:
[quote=引用 1 楼 xomix 的回复:] 这些线程你可以理解为 .net 库与windows桌面交互的一些基本线程。 说两个我知道的: gc,对就是垃圾回收,是由一个程序自己创建线程回收自己的垃圾的,你如果关闭整个程序的资源就会都变成系统垃圾,随时清理。 event实现,是的,事件的实现最后还是用到了一个甚至多个线程来控制,当然这对于使用.net的程序员来说,是你不用考虑的了。 剩下的部分我就没有能马上想到的了,对没错你开一个单线程的窗体程序也会启动很多线程。 至于这些线程的内部机制,那就更不是一两句话能解释清楚的了。
是的,好像自从。net4.0之后,在app启动的时候,GC的回收有专门的后台线程来执行,这样就产生了额外线程;但这不是根本的原因吧,在window中启动exe程序是需要时间的,因为需要分配内存,而且相关联的dll也必须从磁盘或者GAC中加载,这个过程就比较耗时所以就用更多的线程来进行这些初始化操作,以加快程序启动,个人理解。[/quote] gac这些我不知道是系统控制还是每个程序自己去申请的,但是gc和event是我知道的后台线程控制的。xp有Ring0权限的时候锁线程可以很明显的测试出来这些东西的失效(那会儿是3.5)。后来windows7获取Ring0权限基本没可能了我就没再倒腾过了。
Jason_Mao1 2018-03-23
  • 打赏
  • 举报
回复
那些应该和你的程序没有关系,应该是.NET 内部机制 ,你只关心你的线程就可以了 。
mirrorspace 2018-03-23
  • 打赏
  • 举报
回复
留在内存中好,一旦有调用可以立即响应. 不是说软件要吃光硬件资源才能刺激发展吗.正好,先占着再说
stevenjin 2018-03-22
  • 打赏
  • 举报
回复
C#很多窗体控件都要绘制,肯定会产生线程。如果是C++,那些都是自己创建
sj490790083 2018-03-22
  • 打赏
  • 举报
回复
引用 5 楼 From_TaiWan 的回复:
往深了说,属于计算机系统结构的问题 一般讲,举例就是: 用VS建好一个项目,其实很多共用的功能都帮你实现了,替你写了很多很多代码了; 不知道lz有没有接触过用C++写一个窗口,那要调用很多api的,写好多代码的,但是自从有了类似MFC的类库后,建立一个窗口就容易多了,原因是开发环境自动补充了那些代码,程序员只需要写部分即可 打比方盖房子,一般的房子都有柱子、大梁、窗户门的预留口子等,这些共有的东西,基建部门都为你建好了,你只需要做做里工,根据用户特别需要做做个性化装修就行了,柱子、大梁这些虽然你没建,但基建部门为你建了,它也是存在的,能看到的 第二个问题,我觉得,pool的概念,是相对于程序员的,pool的max设置为5(假设正好满负荷运行),只是程序员控制下的5个线程,不是对整个程序的,整个程序要想正常运行,绝不是仅有这5个线程在运行,原因在上面说了,程序员只做了部分工作
精辟
秋的红果实 2018-03-22
  • 打赏
  • 举报
回复
往深了说,属于计算机系统结构的问题 一般讲,举例就是: 用VS建好一个项目,其实很多共用的功能都帮你实现了,替你写了很多很多代码了; 不知道lz有没有接触过用C++写一个窗口,那要调用很多api的,写好多代码的,但是自从有了类似MFC的类库后,建立一个窗口就容易多了,原因是开发环境自动补充了那些代码,程序员只需要写部分即可 打比方盖房子,一般的房子都有柱子、大梁、窗户门的预留口子等,这些共有的东西,基建部门都为你建好了,你只需要做做里工,根据用户特别需要做做个性化装修就行了,柱子、大梁这些虽然你没建,但基建部门为你建了,它也是存在的,能看到的 第二个问题,我觉得,pool的概念,是相对于程序员的,pool的max设置为5(假设正好满负荷运行),只是程序员控制下的5个线程,不是对整个程序的,整个程序要想正常运行,绝不是仅有这5个线程在运行,原因在上面说了,程序员只做了部分工作
sj490790083 2018-03-22
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
比如说图形界面一上来就渲染一番,交互界面有一大堆异步事件要处理,用完线程和内存资源了也不释放,而是留着。这才是常态!
受教。 还有个问题,在该程序中用Task.Factory.StartNew或者ThreadPool.QueueUserWorkItem进行异步操作,不是应该在线程池中空闲的线程上执行吗?为什么进程中的线程数目会变多,而且状态都是System.Diagnostics.ThreadState.Wait?
  • 打赏
  • 举报
回复
比如说图形界面一上来就渲染一番,交互界面有一大堆异步事件要处理,用完线程和内存资源了也不释放,而是留着。这才是常态!
  • 打赏
  • 举报
回复
现在这个年代不是20年前,所以现在应用进程启动后,一开始多用电内存、多用点资源,用不了那么多也留着,这才是常态。 20年前那种动不动就节省启动内存的 c++ 思路反而是不合潮流的。
  • 打赏
  • 举报
回复
这些线程你可以理解为 .net 库与windows桌面交互的一些基本线程。 说两个我知道的: gc,对就是垃圾回收,是由一个程序自己创建线程回收自己的垃圾的,你如果关闭整个程序的资源就会都变成系统垃圾,随时清理。 event实现,是的,事件的实现最后还是用到了一个甚至多个线程来控制,当然这对于使用.net的程序员来说,是你不用考虑的了。 剩下的部分我就没有能马上想到的了,对没错你开一个单线程的窗体程序也会启动很多线程。 至于这些线程的内部机制,那就更不是一两句话能解释清楚的了。

110,537

社区成员

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

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

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