线程如何在对象的实例中工作,特别是我正在使用Windows服务。
那么,我的服务基本上是一个对象的实例吗?
所以,假设我的服务中有一个System.Timers.Timer,并且每10秒触发一次ElapsedEventHandler。
假设Timer事件处理程序中的每个操作都需要1分钟才能完成。
每个事件是否都由其他线程处理?
如果是这样,我的对象的属性如何对此作出反应?属性是否跨线程共享?
什么是线程限制?他们跑了吗?如果是这样,当Timer事件触发并且所有线程都被占用时会发生什么?
非常感谢,我特别感兴趣的是如何跨线程共享属性?如果发生了什么。
喝彩!
答案 0 :(得分:5)
Jon Skeet有一些关于线程基础知识的介绍性页面here(注意这里有17个独立的主题页面)。
每个事件是否都由另一个线程处理?
这取决于具体的计时器,但这将是一个安全(即最坏情况)的假设
是否跨线程共享属性?
是;除非您自己编写,使用[MethodImpl(MethodImplOptions.Synchronized)]
(使方法同步)或使用lock
等构造,否则不会保护多个线程访问您的数据。唯一的例外是使用特殊属性[ThreadStatic]
标记的静态字段,然后每个线程有一个静态字段。
什么是线程限制?他们跑了吗?如果是这样,当Timer事件触发并且所有线程都被占用时会发生什么?
部分受OS资源限制,部分受限于它们是“常规”线程还是池线程。但是如果你使用足够的东西来解决这个问题,你就会有太多的线程。如果没有足够的资源来启动一个线程,它将开始失败(常规线程),或者工作将简单地堆积起来,等待更多可用性(池线程)。完全可能使线程池饱和并使所有内容死锁。基本上避免使用太多线程。
答案 1 :(得分:2)
这是一个相当复杂的话题,我建议花点时间在msdn上使用广泛的线程doco:http://msdn.microsoft.com/en-us/library/3e8s7xdd.aspx
每个计时器已用事件都在一个单独的线程上处理(并且线程来自控制线程可用性的ThreadPool)。对象和属性在线程之间共享,您有责任锁定关键部分。我使用静态Interlocked类进行轻量级锁定。如果你谷歌的话,有很多例子。
答案 2 :(得分:1)
System.Timers.Timer每次Elapsed触发器都会使用一个线程池线程,我不知道是否有最大值,但是线程池应该以一种好的方式处理这个我希望..但是运行到很多线程不推荐同一时间,cpu必须一直改变线程并且有成本。
属性是在不同的线程之间共享的,但是如果你不使它们的线程安全,那么它们就不是线程安全的。
答案 3 :(得分:1)
是的,每次事件触发时都会在线程池线程上处理。此外,您的对象在内存中只有一个实例,因此线程将共享对相同变量的访问权。
阅读线程和计时器是一个非常好的主意,也许看一些例子,因为否则你可能会在让事情可靠地工作的过程中拔掉你的大部分头发。
注意:我希望你的处理程序在每10秒事件发生时不会花费1分钟,因为那时你运行的线程数每分钟会增加5,而且永远不会再次下降...你不能继续做更多事情还有更多的工作。