![]() |
1
19
老实说,我不得不说,我觉得你在这里有点不太习惯。 首先,发布的实际代码并没有真正意义;工作线程正在等待一个信号,但没有任何原因——它实际上不是在任何类型的循环中,也不是在等待资源。其次,如果在接收到关闭信号后确实需要在工作线程中执行一些(可能忽略了)清理代码,那么您的服务可能不会给工作线程足够的时间来清理。 但是,从根本上讲,您所做的就是将问题转移到一个单独的线程上。这可能会使服务对服务控制器保持响应,但它并不能解决设计问题,而且它通过使用线程和互斥增加了许多不必要的复杂性;最终,如果需要,它会使服务更难调试。 假设您需要每隔5秒执行一些代码。其想法是,您可以反转控件,让计时器调用您的工作,而不是“等待”5秒。 这是不好的:
这是好的:
就是这样。这就是你所要做的,定期工作。只要工作本身一次不运行几秒钟,您的服务将保持对服务控制器的响应。您甚至可以支持在这种情况下暂停:
只有当您需要在服务中开始创建工作线程时,工作本身才能运行很长时间,并且您需要能够在中间取消。这往往涉及大量的设计工作,所以我不会在不确定它是否与您的场景相关的情况下进入到这一点。 最好不要在服务中引入多线程语义,除非您确实需要它。如果你只是想安排一些小的工作单元去完成,你肯定不需要它。 |
![]() |
2
1
我最近写了一个服务,需要做一些工作,然后等待N分钟,然后循环。 我还使用了manualResetevent(称为Evt)和onStop中的set()调用。 但我不需要计时器。 在服务线程中,我有:
因此,可能发生了超时=>需要更多工作的时间。调用或set()并终止循环。 |
![]() |
user107586 · 如何处理等待句柄不会导致无限循环? 5 月前 |
![]() |
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 5 月前 |
![]() |
BenjiFB · C#内存缓存:在一次操作中追加到列表? 5 月前 |
![]() |
András Takács · Python多线程问题 9 月前 |
|
András Takács · Python多线程错误 9 月前 |