当前位置:首页 > C# > 正文

C# Task类详解(从创建到任务等待的完整入门指南)

在现代 C# 开发中,异步编程 已成为提升程序性能和响应能力的关键技术。而 Task 类正是 .NET 中实现C# Task 编程模型的核心组件。本文将手把手教你如何创建 Task、启动任务,并掌握多种任务等待方式,即使你是编程小白,也能轻松上手!

C# Task类详解(从创建到任务等待的完整入门指南) Task  异步编程 任务等待 多线程开发 第1张

一、什么是 Task?

在 C# 中,Task 表示一个异步操作。它属于 System.Threading.Tasks 命名空间,是 .NET 提供的用于管理并发和异步操作的高级抽象。相比传统的 ThreadTask 更轻量、更高效,且支持返回值、异常处理和链式调用。

二、如何创建 Task?

创建 Task 有多种方式,下面介绍最常用的几种:

1. 使用 Task 构造函数

using System;using System.Threading.Tasks;class Program{    static void Main()    {        // 创建一个不返回值的任务        Task task = new Task(() =>        {            Console.WriteLine("任务正在执行...");            Task.Delay(1000).Wait(); // 模拟耗时操作            Console.WriteLine("任务完成!");        });        task.Start(); // 必须手动启动        task.Wait();  // 等待任务完成    }}  

注意:使用构造函数创建的 Task 不会自动运行,必须调用 Start() 方法。

2. 使用 Task.Run(推荐方式)

Task.Run 是更简洁、更常用的方式,它会自动将任务调度到线程池中执行:

Task task = Task.Run(() =>{    Console.WriteLine("使用 Task.Run 执行任务");    Task.Delay(1000).Wait();});task.Wait(); // 等待完成  

3. 创建带返回值的 Task(Task<T>)

Task<int> task = Task.Run(() =>{    Console.WriteLine("计算中...");    Task.Delay(1000).Wait();    return 42;});int result = task.Result; // 获取结果(会阻塞当前线程直到完成)Console.WriteLine($"结果是:{result}");  

三、任务等待的几种方式

多线程开发 中,如何“等待”任务完成是一个关键问题。C# 提供了多种等待机制:

1. Wait() 方法(同步阻塞)

调用 task.Wait() 会让当前线程一直等待,直到任务完成。这是最简单但可能造成 UI 卡顿的方式,不建议在 UI 线程中使用。

2. Result 属性(仅适用于 Task<T>)

访问 task.Result 也会阻塞当前线程,直到任务完成并返回结果。

3. await / async(推荐!异步非阻塞)

这是现代 C# 异步编程的最佳实践。使用 asyncawait 可以让程序在等待任务时继续执行其他逻辑,不会阻塞主线程。

using System;using System.Threading.Tasks;class Program{    static async Task Main()    {        Console.WriteLine("开始执行主方法...");        Task<int> task = Task.Run(async () =>        {            await Task.Delay(2000); // 模拟异步操作            return 100;        });        Console.WriteLine("正在等待任务完成...");        int result = await task; // 非阻塞等待        Console.WriteLine($"任务完成,结果是:{result}");    }}  

4. WaitAll / WaitAny(批量等待)

当需要等待多个任务时,可以使用 Task.WaitAll(全部完成)或 Task.WaitAny(任意一个完成):

Task t1 = Task.Run(() => { Task.Delay(1000).Wait(); Console.WriteLine("任务1完成"); });Task t2 = Task.Run(() => { Task.Delay(1500).Wait(); Console.WriteLine("任务2完成"); });// 等待所有任务完成Task.WaitAll(t1, t2);Console.WriteLine("所有任务已完成!");  

四、小结

通过本文,你已经掌握了 C# 中 Task 的基本创建方法和多种任务等待策略。记住:

  • 优先使用 Task.Run 而不是手动构造 + Start
  • 在 UI 或 Web 应用中,尽量使用 async/await 避免阻塞
  • 理解 Wait()Result 的阻塞特性,谨慎使用

掌握这些知识,你就迈入了 C# 异步编程多线程开发 的大门。继续练习,你将能构建出高性能、高响应的应用程序!

关键词回顾:C# Task异步编程任务等待多线程开发