“长时间运行的任务”是什么意思?

39

默认情况下,CLR在池化线程上运行任务,适用于短时间的计算密集型工作。对于长时间运行和阻塞操作,您可以按照以下方式防止使用池化线程:

Task task = Task.Factory.StartNew (() => ...,
TaskCreationOptions.LongRunning);
我正在阅读有关“线程”和“任务”的主题。你能解释一下什么是“长时间运行”和“短时间运行”的任务吗?

我正在阅读有关线程任务的主题。你能解释一下什么是“长时间运行”和“短时间运行”的任务吗?


2
我猜重点在于可能会被阻止,而短或长并不那么相关。 - David Heffernan
我在这里同意@DavidHeffernan的观点。 - jay_t55
1个回答

45
在通用的线程池中,您可以根据短线程和长线程的启动时间和运行时间进行区分。
线程通常需要一些时间来创建并到达可以开始运行代码的点。
这意味着如果您运行大量线程,其中每个线程需要一分钟才能启动,但只运行一秒钟(不准确的时间,但意图在于显示关系),则每个线程的运行时间将被启动时间所淹没。
这是使用线程池的原因之一:线程在完成工作后不会终止。相反,它们会停留以便重复使用,这样就不必再次花费启动时间。
因此,在这种情况下,长运行线程的运行时间远大于启动所需的时间。在这种情况下,启动时间比短时间运行线程更不重要。
相反,短线程是其运行时间小于或可与启动时间相媲美的线程。
对于.NET特别是操作有点不同。线程池代码将在达到最小线程数后,尝试将线程创建限制为每半秒钟一个。
因此,如果您知道您的线程将是长时间运行的,请通知调度程序,以便它可以相应地进行调整。这可能意味着只创建一个新线程而不是从池中获取一个线程,以便池可以继续服务短时间运行的任务(无法保证这种行为,但以这种方式做是有意义的)。
但是,这并不改变长时间运行和短时间运行的“含义”,所有内容都说明一些阈值使得区分两者很有意义。对于.NET,我建议半秒钟的数字是一个不错的选择。

1
我曾以为没有线程...... http://blog.stephencleary.com/2013/11/there-is-no-thread.html - Mick
2
Mick,那个链接讨论了异步I/O操作,已经存在许多线程在做一些_其他_事情,例如当你调用任务工厂时可能要做的事情 :-) - paxdiablo
我做过很多多线程编程,但没有使用TPL。那么异步操作与异步I/O操作有何区别? - Mick
1
@Mick,异步操作是指在并行执行的任何操作。例如,您的文字处理器可能在一个线程中格式化文本,在另一个线程中进行拼写检查,两者都不需要涉及I/O。 - paxdiablo
1
Mick,你问异步操作和异步I/O操作有什么区别。嗯,那就是我解释过的I/O部分。除此之外,我不确定你的问题是什么意思。也许你可以澄清一下。 - paxdiablo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接