当前位置: 首页 > news >正文

C#中Task的详细用法

Task 概述

Task 是 .NET 中用于表示异步操作的类,属于 System.Threading.Tasks 命名空间。它封装了一个异步操作,提供状态管理、取消支持、延续任务等功能,是编写异步代码的核心组件之一。

Task 的核心特性

  • 异步执行:Task 可以在后台线程或线程池中运行,避免阻塞主线程。
  • 状态跟踪:提供 Status 属性(如 RanToCompletionFaultedCanceled)。
  • 结果获取:通过 Result 属性获取返回值(泛型 Task<T>)。
  • 取消支持:结合 CancellationToken 实现任务取消。
  • 延续任务:通过 ContinueWith 定义任务完成后的操作。

常用使用方法

创建并启动 Task

使用 Task.RunTask.Factory.StartNew 启动一个后台任务:

// 1. 使用 Task.Run(最常用)static void Main(string[] args){// 1. 使用构造函数(需要手动启动)Task task1 = new Task(() =>{Thread.Sleep(100);Console.WriteLine($"hello,task1的线程ID为{Thread.CurrentThread.ManagedThreadId}");});task1.Start();// 2. 使用 Task.Factory.StartNewTask task2 = Task.Factory.StartNew(() =>{Thread.Sleep(100);Console.WriteLine($"hello,task2的线程ID为{Thread.CurrentThread.ManagedThreadId}");});//3.使用 Task.Run(最常用)Task task3 = Task.Run(() => {Thread.Sleep(100);Console.WriteLine($"hello,task3的线程ID为{Thread.CurrentThread.ManagedThreadId}");});Console.WriteLine($"主线程ID为{Thread.CurrentThread.ManagedThreadId}");Console.ReadKey();}

执行结果如下,可以看到先输出了 “主线程ID为1”,说明了Task不会阻塞主线程,并且线程执行是无序的
在这里插入图片描述
我们也可以创建有返回值的Task,用法和没有返回值的基本一致,,代码如下:

Task<string> task1 = new Task<string>(() =>
{Thread.Sleep(100);return ($"task1的线程ID为{Thread.CurrentThread.ManagedThreadId}");});
task1.Start();Task<int> task2 = Task.Factory.StartNew(() =>
{Thread.Sleep(100);return 222;
});Task<bool> task3 = Task.Run(() =>
{Thread.Sleep(100);return true;
});Console.WriteLine($"主线程ID为{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine(task1.Result);
Console.WriteLine(task2.Result);
Console.WriteLine(task3.Result);
Console.ReadKey();

执行结果如下:
在这里插入图片描述
task.Resut获取结果时会阻塞主线程,即如果task没有执行完成,会等待task执行完成获取到Result,所以这里是顺序执行。

等待 Task 完成

通过 WaitWaitAllawait 等待任务完成:

var task = Task.Run(() => {Thread.Sleep(1000);return "完成";
});// 阻塞等待
task.Wait(); 
Console.WriteLine(task.Result);// 异步等待(需在 async 方法中使用)
string result = await task;
处理 Task 返回值

使用泛型 Task<T> 获取返回值:

Task<int> task = Task.Run(() => {return 42;
});
Console.WriteLine(task.Result); // 输出 42
任务延续(ContinueWith)

在任务完成后执行后续操作:

Task.Run(() => {Console.WriteLine("任务1");
}).ContinueWith(prevTask => {Console.WriteLine("任务2");
});
取消 Task

通过 CancellationToken 实现任务取消:

var cts = new CancellationTokenSource();
var task = Task.Run(() => {while (true) {cts.Token.ThrowIfCancellationRequested();Thread.Sleep(100);}
}, cts.Token);cts.CancelAfter(1000); // 1秒后取消
异常处理

通过 AggregateException 捕获任务异常:

try {Task.Run(() => throw new Exception("错误")).Wait();
} catch (AggregateException ex) {Console.WriteLine(ex.InnerException.Message);
}

最佳实践

  • 避免 Task.ResultTask.Wait 导致死锁(尤其在 UI 线程中)。
  • 使用 Task.WhenAll 并行执行多个任务:
Task<int> task1 = Task.Run(() => 1);
Task<int> task2 = Task.Run(() => 2);
int[] results = await Task.WhenAll(task1, task2);

Task 是现代 C# 异步编程的基础,合理使用可提升程序性能和响应能力。

http://www.dtcms.com/a/618209.html

相关文章:

  • 自己怎么做企业网站建设免费代理服务器ip地址
  • 前端 css selector 的层叠 优先级与继承
  • 基于python二手房数据分析系统 可视化 Scrapy 爬虫 链家二手房数据 Django框架 基于用户的协同过滤推荐 二手房推荐系统 (源码)✅
  • Rust 内部可变性的访问器模式
  • ThinkPHP8学习篇(十二):模型关联(二)
  • 药品行业做网站windows wordpress
  • 【读代码】LightRAG轻量级知识图谱增强检索系统的架构与实现
  • arm架构设备使用FISCO BCOS上搭建多机区块链网络
  • 【Android】LRU 与 Android 缓存策略
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 26--数据驱动--参数化处理 Excel 文件 3
  • 第41节:第三阶段总结:打造一个AR家具摆放应用
  • 建设网站流程2022年最新新闻播报稿件
  • 网站地图的作用长沙网站开发设计
  • 【读代码】最新端侧TTS模型NeuTTS-Air
  • 做装修网站多少钱四川成都住建局官网
  • Microsoft 远程桌面app,支持挂机宝,云主机服务器
  • 基于MATLAB的粒子群优化(PSO)算法对25杆桁架结构进行优化设计
  • 智能驾驶:从感知到规控的自动驾驶系统全解析
  • 练习项目:基于 LangGraph 和 MCP 服务器的本地语音助手
  • 在 VMware 的 Ubuntu 22.04 虚拟机和 Windows 主机之间设置共享剪贴板
  • 淄博专业网站建设哪家专业公司装修设计工程
  • 金融网站的设计中和阗盛工程建设有限公司网站
  • 《JavaScript基础-Day.4》笔记总结
  • 关于C++中的预编译指令
  • 做网站的重要性深圳程序开发
  • 其他落地手册:facebook实现与音视频剖析
  • 建站方法移动课程播放网站建设多少钱
  • ZJUCTF2025(预赛+决赛)-我的writeup
  • 2025.11.16 AI快讯
  • Java分治算法题目练习(快速/归并排序)