默认情况下,CLR在池化线程上运行任务,这是理想的选择 短期运行的计算绑定工作。适用于长时间运行和阻塞 操作,您可以按如下方式阻止使用池化线程:
Task task = Task.Factory.StartNew (() => ..., TaskCreationOptions.LongRunning);
我正在阅读有关thread
和task
的主题。你能告诉我什么是"长[呃] - 运行"和"短跑"任务?
答案 0 :(得分:16)
在通用线程池中,您可以根据启动时间和运行时间之间的比较来区分短时运行和长时运行的线程。
线程通常需要一些时间来创建,并且可以开始运行代码。
这意味着如果你运行大量的线程,每个线程都需要一分钟才能启动,但只运行一秒钟(不是准确的时间,但这里的意图只是为了显示关系),每个线程的运行时间都是被第一个地方带走的时间淹没了。
使用线程池的原因之一:线程一旦完成工作就不会被终止。相反,它们可以重复使用,以便不再重新启动启动时间。
因此,从这个意义上讲,长时间运行的线程的运行时间远远大于启动它所需的时间。在这种情况下,启动时间远不如短运行线程重要。
相反,短运行线程的运行时间小于或等于启动时间。
对于.NET而言,它的 little 操作不同。线程池代码一旦达到最小线程数,就会尝试将线程创建限制为每半秒一次。
因此,如果您知道您的线程将长时间运行,您应该通知调度程序,以便它可以相应地调整自己。这可能意味着只创建一个 new 线程而不是从池中获取一个线程,这样就可以将池保留为预期的短期运行任务(不保证这种行为,但这样做是有意义的。)
然而,这并没有改变长时间运行和短时间运行的含义,这意味着它有一些阈值 at区分这两者是有道理的。对于.NET,我建议半秒数字将是一个不错的选择。