C# Task 异步任务

📅 2026/7/20 10:06:08
C# Task 异步任务
一、Task 异步任务三种创建方式1. 核心原理Task 是 .NET 新一代异步任务封装替代传统 Thread更轻量、可管控、支持取消、支持返回值、自带任务状态。主流三种创建方式new Task()手动创建需要手动 Start() 启动Task.Run()静态方法创建并自动启动最常用Task.Factory.StartNew()任务工厂创建功能更全面2. 独立代码演示// 方式1new Task 手动创建 手动Start Task t1 new Task(DoWork); t1.Start(); // 支持Lambda简写 Task t2 new Task(() { Console.WriteLine(自定义任务); }); // 方式2Task.Run 静态创建自动运行开发最常用 Task.Run(() { Console.WriteLine(Task.Run 自动执行); }); // 方式3任务工厂创建 Task.Factory.StartNew(() { Console.WriteLine(Factory 创建任务); });3. 注意事项new Task创建的任务必须手动 Start()否则不执行Task.Run创建后自动启动无需 StartTask 相比 Thread 支持状态判断、取消、返回值、回调功能更强二、Task 带参数、带取消令牌 CancellationTokenSource1. 核心原理CancellationTokenSource取消令牌专门用于安全终止 Task 异步任务替代粗暴的线程 Abort 终止。核心机制cts.Token通行证绑定给 Taskcts.Cancel()触发取消请求cts.IsCancellationRequested判断是否收到取消信号2. 完整可运行代码Task t1 null; // 创建取消令牌对象 CancellationTokenSource cts new CancellationTokenSource(); int i 0; private void button1_Click(object sender, EventArgs e) { // 如果任务完成必须重置令牌一个任务对应一个令牌 if (t1 ! null t1.IsCompleted) { cts new CancellationTokenSource(); t1 new Task(DoWork, cts.Token); } t1.Start(); } // 取消任务 private void button2_Click(object sender, EventArgs e) { cts.Cancel(); // 发送取消信号 } // 异步任务逻辑 public void DoWork() { // 根据取消信号判断是否继续执行 while (!cts.IsCancellationRequested) { Invoke(new Action(() { label1.Text i.ToString(); })); i; } }3. Task 三大状态属性t1.IsCompleted; // 是否正常执行完成 t1.IsCanceled; // 是否因为取消而结束 t1.IsFaulted; // 是否因为异常崩溃结束4. 注意事项每个新 Task 必须 new 新的 CancellationTokenSource旧令牌不可复用禁止使用 Abort 终止 Task必须使用取消令牌安全无异常IsCancellationRequested默认 false调用 Cancel() 后变为 true任务重启前必须判断 IsCompleted防止重复启动报错三、泛型 Task 带返回值TaskT1. 核心原理普通 Task 无返回值泛型 TaskT可以让异步任务执行完毕后返回指定类型结果通过.Result获取返回值。2. 多层返回值代码演示全覆盖// 1. 返回int Taskint t1 new Taskint(() { return 100; }); // 2. 返回string Taskstring t2 new Taskstring(() { return 哈兰德; }); // 3. 返回Task任务嵌套 TaskTask t3 new TaskTask(() { return new Task(() { }); }); // 4. 返回带返回值的Task TaskTaskint t4 new TaskTaskint(() { return new Taskint(() 100); }); // 5. 多层嵌套任务 TaskTaskTask t5 new TaskTaskTask(() { return new TaskTask(() { return new Task(() { }); }); });3. 注意事项TaskT必须 return 对应类型数据嵌套 Task 多用于复杂异步编排日常开发极少使用普通 Task 等同于Taskvoid无返回值四、异步任务结果获取阻塞获取 回调获取1. 核心原理获取 Task 返回值有两种方式.Result主线程阻塞等待任务结束卡死UI禁止在窗体使用ContinueWith任务执行完毕后自动回调不阻塞UI推荐2. 对比代码演示private void button1_Click(object sender, EventArgs e) { // 创建带返回值任务 Taskstring t1 new Taskstring(() { Thread.Sleep(2000); return 魔笛-莫迪老仙; }); t1.Start(); // 【方式1错误写法】Result 阻塞主线程窗体卡死 // string res t1.Result; // 【方式2正确写法】ContinueWith 回调获取结果不阻塞UI t1.ContinueWith(t { // 子线程回调获取结果 Console.WriteLine(任务结果 t.Result); }); }3. 注意事项WinForm 中绝对禁止直接调用 .Result会直接卡死界面ContinueWith 是任务完成后的异步回调不会阻塞主线程回调内部属于子线程如需更新UI必须 Invoke五、整体知识点总结Task三种创建new Task手动启动、Task.Run自动启动、Factory工厂创建取消令牌cts 安全终止任务替代Abort新任务必须新令牌任务状态IsCompleted、IsCanceled、IsFaulted 判断任务执行情况泛型TaskTaskT 实现异步任务返回值结果获取Result阻塞卡死、ContinueWith异步回调安全获取