如何创建并启动Task,无需async await设置完成处理程序
使用Task库实现经典完成处理程序逻辑(无async/await)
基础示例:带结果返回的任务+完成处理程序
以下代码演示如何创建并启动任务,通过ContinueWith绑定完成处理程序,在任务结束后自动执行后续逻辑并访问结果:
using System; using System.Threading; using System.Threading.Tasks; class Program { static void Main() { // 创建并启动一个耗时计算任务(默认使用线程池) var calculationTask = Task.Run(() => { // 模拟耗时操作 Thread.Sleep(2000); return 42; // 任务返回的结果 }); // 绑定完成处理程序:任务结束后自动触发 calculationTask.ContinueWith(completedTask => { // 处理任务不同状态 if (completedTask.IsFaulted) { Console.WriteLine($"任务执行失败: {completedTask.Exception.InnerException.Message}"); } else if (completedTask.IsCanceled) { Console.WriteLine("任务已被取消"); } else { // 访问任务结果,执行后续逻辑 Console.WriteLine($"任务完成,计算结果: {completedTask.Result}"); } }, TaskContinuationOptions.ExecuteSynchronously); // 指定在原任务线程同步执行(可选) // 主线程继续执行其他操作(示例中保持控制台窗口打开) Console.WriteLine("主线程正在处理其他工作..."); Console.ReadLine(); } }
关键说明
Task.Run:快速创建并启动基于线程池的任务,无需手动管理线程。ContinueWith:Task库中实现完成处理程序的核心API,它会在绑定的任务完成(成功/失败/取消)后自动执行。TaskContinuationOptions.ExecuteSynchronously:可选参数,让延续任务在原任务的线程上执行(如果原任务线程尚未终止),符合你要求的“可能在Task的线程上运行”的场景。- 可通过
completedTask参数访问原任务的状态(IsFaulted/IsCanceled)和结果(Result)。
另一种任务创建方式:先实例化再启动
如果需要更精细控制任务创建时机,可以先实例化Task再启动:
var dataFetchTask = new Task<string>(() => { // 模拟数据获取操作 Thread.Sleep(1500); return "从数据源获取的内容"; }); // 绑定完成处理程序 dataFetchTask.ContinueWith(task => { Console.WriteLine($"数据获取完成: {task.Result}"); }); // 手动启动任务 dataFetchTask.Start(); Console.WriteLine("主线程继续执行..."); Console.ReadLine();
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

