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

本文关键字:运行 操作 长时间 执行长 并行 执行 任务 | 更新日期: 2023-09-27 17:50:49

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

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

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

只要你保持前台线程存活,使用任务是可以的-只要确保指定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();
    }
}