使用Task(任务并行库)执行长时间运行操作(有时可能需要几个小时才能完成)是一种好方法吗?
在其中一个堆栈溢出线程中,我看到一个人告诉不要使用Threadpool,如果长时间运行的操作需要几秒钟才能完成。我有这样一个疑问,因为Task也使用了ThreadPool,以便分配工作,而不需要经历线程创建/或不必要的上下文切换的开销。
答案 0 :(得分:1)
只要保持前台线程处于活动状态,使用任务就可以了 - 如果您正在运行大量并发任务,请确保指定TaskCreationOptions.LongRunning
选项以防止线程饥饿。
以下简单的控制台应用程序演示了缺少前台线程如何终止"长时间运行的线程"过程结束时过早。
class Program
{
static void Main( string[] args )
{
Task.Factory.StartNew( () =>
{
Console.WriteLine( "Before sleep" );
System.Threading.Thread.Sleep( 5000 );
Console.WriteLine( "After sleep" );
}
, TaskCreationOptions.LongRunning
);
// press a key prior to the 5 second sleep expiration to demonstrate early termination
Console.ReadKey();
}
}