【发布时间】:2016-08-06 04:55:13
【问题描述】:
在处理任务时,经验法则似乎是线程池 - 通常由例如调用 Task.Run() 或 Parallel.Invoke() - 应该用于相对较短的操作。在处理长时间运行的操作时,我们应该使用TaskCreationOptions.LongRunning 标志,以便 - 据我了解 - 避免阻塞线程池队列,即将工作推送到新创建的线程。
但究竟什么是长时间运行操作? 在时间方面有多长? 在决定是否使用LongRunning 时,除了预期的任务持续时间之外,是否还有其他因素需要考虑,例如预期的 CPU 架构(频率、核心数量,...)或从程序员的角度来看将尝试一次运行的任务数量?
例如,假设我有 500 个任务要在一个专用应用程序中处理,每个任务需要 10-20 秒才能完成。我是否应该使用 Task.Run 启动所有 500 个任务(例如在循环中),然后等待所有任务,可能是 LongRunning,同时保留默认的最大并发级别?再说一次,如果我在这种情况下设置LongRunning,与省略LongRunning相比,这不会创建500个新线程并且实际上会导致大量开销和更高的内存使用(由于分配了额外的线程)吗?这是假设在等待这 500 个任务时不会安排新任务执行。
我猜想设置LongRunning 的决定取决于在给定时间间隔内向线程池发出的请求数,并且LongRunning 应该只用于预计需要更长的时间的任务大多数线程池放置的任务——根据定义,至多是所有任务的一小部分。换句话说,这似乎是一个排队和线程池利用率优化问题,如果有的话,应该可以通过测试逐个解决。我说的对吗?
【问题讨论】:
标签: c# .net task-parallel-library task threadpool