任务并行库执行长时间运行的操作

时间:2014-03-19 03:51:22

标签: c# .net multithreading

使用Task(任务并行库)执行长时间运行操作(有时可能需要几个小时才能完成)是一种好方法吗?

在其中一个堆栈溢出线程中,我看到一个人告诉不要使用Threadpool,如果长时间运行的操作需要几秒钟才能完成。我有这样一个疑问,因为Task也使用了ThreadPool,以便分配工作,而不需要经历线程创建/或不必要的上下文切换的开销。

1 个答案:

答案 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();
    }
}