Skip to content

C# 多线程 04-使用任务平行库 01-创建 Task

🏷️ 《C# 多线程》

简介

.Net Framework4.0 引入了一个新的关于异步操作的 API - 任务并行库(Task Parallel Library,简称 TPL)。

.Net Framework4.5 对该 API 进行了轻微的改进,使用更简单。

TPL 可被认为是线程池之上的有一个抽象层,其对程序员隐藏了于线程池交互的底层代码,可以使用或不使用独立线程运行。

C#5.0已经内置了对TPL的支持,允许我们使用新的 awaitasync 关键字以平滑的、舒服的方式操作任务。

创建 Task

csharp
static void Main(string[] args)
{
    var t1 = new Task(() => TaskMethod("Task 1"));
    var t2 = new Task(() => TaskMethod("Task 2"));
    t2.Start();
    t1.Start();

    // 无需调用 Start 方法,立即开始工作
    // Task.Run 只是 Task.Factory.StartNew 的一个快捷方式,但是后者有附加的选项
    Task.Run(() => TaskMethod("Task 3"));
    Task.Factory.StartNew(() => TaskMethod("Task 4"));

    // 标记任务为长时间运行,结果该任务将不使用线程池,而在单独的线程中运行;
    // 然而根据该任务的当前的任务调度器(task scheduler),运行方式有可能不同。
    Task.Factory.StartNew(() => TaskMethod("Task 5"), TaskCreationOptions.LongRunning);

    Thread.Sleep(TimeSpan.FromSeconds(1));
    Console.ReadLine();
}

static void TaskMethod(string name)
{
    Console.WriteLine($"Task {name} is running on a thread id {Thread.CurrentThread.ManagedThreadId}. Is thread pool thread: {Thread.CurrentThread.IsThreadPoolThread}");
}

打印结果

txt
Task Task 2 is running on a thread id 3. Is thread pool thread: True
Task Task 1 is running on a thread id 4. Is thread pool thread: True
Task Task 4 is running on a thread id 3. Is thread pool thread: True
Task Task 3 is running on a thread id 6. Is thread pool thread: True
Task Task 5 is running on a thread id 7. Is thread pool thread: False