"长期任务"是什么意思?

Per*_*kie 20 .net c# multithreading task

默认情况下,CLR在池化线程上运行任务,这对于短期运行的计算绑定工作是理想的.对于长时间运行和阻塞操作,可以按如下方式阻止使用池化线程:

Task task = Task.Factory.StartNew (() => ...,
TaskCreationOptions.LongRunning);
Run Code Online (Sandbox Code Playgroud)

我正在阅读关于thread和的主题task.你能解释一下"长[呃] - 跑"和"短跑"的任务是什么?

pax*_*blo 17

一般的线程池中,您可以根据启动时间和运行时间之间的比较来区分短时运行和长时运行的线程.

线程通常需要一些时间才能创建,并且可以开始运行代码.

这意味着如果你运行大量的线程,每个线程都需要一分钟才能启动,但只运行一秒钟(不准确的时间,但这里的意图只是为了显示关系),每个线程的运行时间将被淹没把它们放在第一位的时间.

这是使用线程池的原因之一:线程一旦完成工作就不会终止.相反,它们可以重复使用,这样就不会再次启动启动时间.

因此,从这个意义上讲,长时间运行的线程的运行时间远远大于启动它所需的时间.在这种情况下,启动时间远不如短运行线程重要.

相反,短运行线程的运行时间小于或等于启动时间.


特别是对于.NET,它在操作上有点不同.线程池代码一旦达到最小线程数,就会尝试将线程创建限制为每半秒一个.

因此,如果您知道您的线程将长时间运行,您应该通知调度程序,以便它可以相应地调整自己.这可能意味着只创建一个线程而不是从池中获取一个线程,这样就可以让池按预期为短时间运行的任务提供服务(不保证该行为,但这样做是有意义的).

然而,这并没有改变的意思长期运行和短期运行的,它的意思是,有一些门槛的,它是有道理的区分两者.对于.NET,我建议半秒数字将是一个不错的选择.

  • Mick,那个链接谈论异步I/O操作,有很多线程存在做其他事情,比如你打电话给任务工厂时可能要做的事情:-) (2认同)
  • @Mick,异步操作是并行发生的_任何事情_。例如,您的文字处理器可能在一个线程中格式化文本并在另一个线程中进行拼写检查,这两者都不需要涉及 I/O。 (2认同)