跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp Task 基础
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C# Task基础 = == 介绍 == '''Task'''是C#异步编程的核心概念之一,属于.NET框架中的<code>System.Threading.Tasks</code>命名空间。它表示一个异步操作,可以用于执行长时间运行的任务而不会阻塞主线程。Task提供了一种更高效的方式来处理并发和并行操作,相比传统的线程(Thread)和线程池(ThreadPool),Task更加轻量级且易于管理。 Task的主要特点包括: * 支持异步操作的启动、等待和结果获取。 * 可以串联多个Task(通过<code>ContinueWith</code>或<code>async/await</code>)。 * 提供取消、异常处理和进度报告等功能。 == Task的基本用法 == === 创建和运行Task === Task可以通过<code>Task.Run</code>或<code>new Task</code>来创建。以下是两种方式的示例: <syntaxhighlight lang="csharp"> using System; using System.Threading.Tasks; class Program { static void Main() { // 方式1:使用Task.Run启动一个任务 Task task1 = Task.Run(() => { Console.WriteLine("Task1 正在运行..."); }); // 方式2:显式创建并启动Task Task task2 = new Task(() => { Console.WriteLine("Task2 正在运行..."); }); task2.Start(); // 等待任务完成 Task.WaitAll(task1, task2); Console.WriteLine("所有任务完成!"); } } </syntaxhighlight> '''输出:''' <pre> Task1 正在运行... Task2 正在运行... 所有任务完成! </pre> === 带返回值的Task === Task可以返回结果,使用<code>Task<TResult></code>泛型类。例如: <syntaxhighlight lang="csharp"> using System; using System.Threading.Tasks; class Program { static void Main() { Task<int> task = Task.Run(() => { Console.WriteLine("计算中..."); return 42; // 返回一个整数值 }); // 获取任务结果(会阻塞直到任务完成) int result = task.Result; Console.WriteLine($"计算结果: {result}"); } } </syntaxhighlight> '''输出:''' <pre> 计算中... 计算结果: 42 </pre> == Task的等待和延续 == === 等待Task完成 === 可以使用<code>Task.Wait</code>、<code>Task.WaitAll</code>或<code>Task.WaitAny</code>来同步等待任务完成。 <syntaxhighlight lang="csharp"> Task task1 = Task.Run(() => { Thread.Sleep(1000); Console.WriteLine("Task1完成"); }); Task task2 = Task.Run(() => { Thread.Sleep(2000); Console.WriteLine("Task2完成"); }); Task.WaitAll(task1, task2); // 等待所有任务完成 Console.WriteLine("所有任务完成!"); </syntaxhighlight> '''输出:''' <pre> Task1完成 Task2完成 所有任务完成! </pre> === 使用ContinueWith串联任务 === <code>ContinueWith</code>允许在一个Task完成后自动启动另一个Task。 <syntaxhighlight lang="csharp"> Task<int> task = Task.Run(() => { Console.WriteLine("第一个任务运行"); return 10; }); Task continuationTask = task.ContinueWith((previousTask) => { Console.WriteLine($"前一个任务的结果: {previousTask.Result}"); }); continuationTask.Wait(); </syntaxhighlight> '''输出:''' <pre> 第一个任务运行 前一个任务的结果: 10 </pre> == 异常处理 == Task中的异常会被捕获并存储在<code>Task.Exception</code>属性中。可以通过<code>try-catch</code>块或检查<code>Exception</code>属性来处理异常。 <syntaxhighlight lang="csharp"> Task task = Task.Run(() => { throw new InvalidOperationException("任务出错!"); }); try { task.Wait(); } catch (AggregateException ex) { foreach (var innerEx in ex.InnerExceptions) { Console.WriteLine($"捕获异常: {innerEx.Message}"); } } </syntaxhighlight> '''输出:''' <pre> 捕获异常: 任务出错! </pre> == 实际应用案例 == === 并行下载文件 === 以下示例展示如何使用Task并行下载多个文件: <syntaxhighlight lang="csharp"> using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { string[] urls = { "https://example.com/file1.txt", "https://example.com/file2.txt", "https://example.com/file3.txt" }; HttpClient client = new HttpClient(); Task[] downloadTasks = new Task[urls.Length]; for (int i = 0; i < urls.Length; i++) { string url = urls[i]; downloadTasks[i] = Task.Run(async () => { string content = await client.GetStringAsync(url); Console.WriteLine($"下载完成: {url}, 长度: {content.Length}"); }); } await Task.WhenAll(downloadTasks); Console.WriteLine("所有文件下载完成!"); } } </syntaxhighlight> '''输出(假设文件存在):''' <pre> 下载完成: https://example.com/file1.txt, 长度: 1024 下载完成: https://example.com/file2.txt, 长度: 2048 下载完成: https://example.com/file3.txt, 长度: 512 所有文件下载完成! </pre> == 总结 == Task是C#异步编程的核心组件,提供了高效的任务调度和管理机制。通过Task,开发者可以轻松实现并行操作、异步等待和异常处理。结合<code>async/await</code>(将在后续章节介绍),Task能进一步简化异步代码的编写。 === 关键点回顾 === * Task表示一个异步操作,可通过<code>Task.Run</code>或构造函数创建。 * 使用<code>Task.Wait</code>、<code>Task.WhenAll</code>或<code>Task.WhenAny</code>等待任务完成。 * 通过<code>ContinueWith</code>串联多个任务。 * 异常需通过<code>AggregateException</code>处理。 == 进阶学习建议 == * 学习<code>async/await</code>关键字以简化异步代码。 * 探索<code>TaskCancellationToken</code>实现任务取消。 * 研究<code>TaskScheduler</code>自定义任务调度逻辑。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 异步编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)