Skip to content

C# 多线程 04-使用任务平行库 02-使用任务执行基本的操作

🏷️ 《C# 多线程》

使用任务执行基本的操作

csharp
/// <summary>
///  使用任务执行基本的操作
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
    // 直接调用,同步执行,不是线程池中的线程
    TaskMethod("Main Thread Task");
    
    Task<int> task = CreateTask("Task 1");
    // 启动任务
    // 该任务会被放置在线程池中
    task.Start();
    // 等待结果(直到任务返回前,主线程一直处于阻塞状态)
    int result = task.Result;
    Console.WriteLine($"Result is: {result}");

    task = CreateTask("Task 2");
    // 同步运行该任务
    // 该任务会运行在主线程中,运行结果同直接调用一样
    task.RunSynchronously();
    result = task.Result;
    Console.WriteLine($"Result is: {result}");

    task = CreateTask("Task 3");
    Console.WriteLine(task.Status); // Created
    // 启动任务
    task.Start();
    // 这里没有阻塞主线程,而是在任务完成前循环打印任务状态
    // 任务状态分别为:Created、Running 和 RanToCompletion
    while (!task.IsCompleted)
    {
        Console.WriteLine(task.Status); // Running 和 RanToCompletion
        Thread.Sleep(TimeSpan.FromSeconds(0.5));
    }
    Console.WriteLine(task.Status); // RanToCompletion
    result = task.Result;
    Console.WriteLine($"Result is: {result}");

    Console.ReadLine();
}

static Task<int> CreateTask(string name)
{
    return new Task<int>(() => TaskMethod(name));
}

static int TaskMethod(string name)
{
    Console.WriteLine($"Task {name} is running on a thread id {Thread.CurrentThread.ManagedThreadId}. Is thread pool thread: {Thread.CurrentThread.IsThreadPoolThread}");
    Thread.Sleep(TimeSpan.FromSeconds(2));
    return 42;
}

打印结果

txt
Task Main Thread Task is running on a thread id 1. Is thread pool thread: False
Task Task 1 is running on a thread id 3. Is thread pool thread: True
Result is: 42
Task Task 2 is running on a thread id 1. Is thread pool thread: False
Result is: 42
Created
Task Task 3 is running on a thread id 4. Is thread pool thread: True
Running
Running
Running
Running
Running
RanToCompletion
Result is: 42