【发布时间】:2013-11-22 00:40:50
【问题描述】:
System.Threading.Timer 类允许您定期调用方法:指定的方法在ThreadPool 的线程上执行。但是,如果您需要执行一个高优先级的周期性任务,如果ThreadPool 中没有更多可用线程,则无法执行此任务。
解决上述问题的方法是使用简单的后台线程和Thread.Sleep 方法而不是System.Threading.Timer。还有其他方法可以处理这个问题吗?那么为什么System.Threading.Timer 类使用ThreadPool?
更新。例如,假设您有一个应用程序需要处理具有不同优先级的不同类别的活动。
- 周期性活动的持续时间很短,但它们具有最高优先级,因为它们确保应用程序的正常运行,因此很有必要存在可用线程来完成它们。这种活动可以在应用程序启动时启动。
-
非周期性任务可能有更长的持续时间。例如:从远程客户端请求的处理任务。这些活动的到达时间可能是随机的,因此在这种情况下使用
ThreadPool是有意义的。
这里有一些定期活动的例子。
- 应用程序需要定期检查您的互联网连接是否正常,然后定期向服务器发送请求。
- 客户端需要定期检查某些服务器是否已启动并运行。
- 服务器希望定期检查与其客户端的连接,以关闭较少使用的连接。
当存在具有不同优先级的任务时,使用ThreadPool 管理所有这些异构任务是否正确?或者,是否应该使用池来处理相同类型的活动?
何时应该使用专用线程来处理周期性任务?什么时候使用System.Threading.Timer 类更有意义?
特别是:什么时候不应该使用System.Threading.Timer 类来处理周期性任务?
【问题讨论】:
-
线程池正常情况下不是会自行增减吗?使用线程池意味着您不必为每个计时器设置专用线程。不过,如果您愿意,您可以拥有一个专用线程,并完全避免所谓的线程池已满问题。
-
这里有很多问题,有些不清楚,有些范围太广。不要添加更多示例,只需更具体。
-
我改进了我的问题以进一步澄清我的疑问。
标签: c# .net multithreading threadpool