Task.ContinueWith
方法是 Task
类的一个成员,它允许你为一个任务添加一个延续操作。这个延续操作会在任务完成时执行,无论是成功完成、发生异常还是被取消。你可以使用这个方法来执行一些清理工作,或者基于前一个任务的结果来启动另一个任务。
以下是 Task.ContinueWith
方法的一些常见用法:
基本用法
Task task = Task.Run(() =>
{// 执行一些工作return "Hello from Task";
});// 添加一个延续操作,当任务完成时执行
task.ContinueWith(antecedent =>
{// antecedent 是前一个任务,即 taskstring result = antecedent.Result; // 获取前一个任务的结果Console.WriteLine(result);
});
处理异常
Task task = Task.Run(() =>
{throw new Exception("Something went wrong");
});task.ContinueWith(antecedent =>
{if (antecedent.IsFaulted){// antecedent.Exception 包含异常信息Console.WriteLine(antecedent.Exception.Flatten().InnerException.Message);}
});
处理任务取消
CancellationTokenSource cts = new CancellationTokenSource();
Task task = Task.Run(() =>
{// 模拟长时间运行的任务Thread.Sleep(5000);
}, cts.Token);// 取消任务
cts.Cancel();task.ContinueWith(antecedent =>
{if (antecedent.IsCanceled){Console.WriteLine("Task was canceled.");}
});
使用任务结果启动另一个任务
Task<string> task = Task.Run(() => "Hello");
task.ContinueWith(antecedent =>
{string input = antecedent.Result;return input.ToUpper(); // 将结果转换为大写
}).ContinueWith(antecedent =>
{Console.WriteLine(antecedent.Result); // 输出 "HELLO"
});
指定任务完成的状态
ContinueWith
方法允许你指定在哪些状态下执行延续操作:
task.ContinueWith(antecedent =>
{// 这个延续操作只会在任务成功完成时执行Console.WriteLine("Task completed successfully.");
}, TaskContinuationOptions.OnlyOnRanToCompletion);
指定延续任务的执行方式
你还可以指定延续任务的执行方式,比如是否应该在同一个线程上执行:
task.ContinueWith(antecedent =>
{// 这个延续操作会在不同的线程上执行Console.WriteLine("Continuation running on a different thread.");
}, TaskContinuationOptions.ExecuteSynchronously);
ContinueWith
方法非常灵活,可以根据你的需要来处理任务完成后的各种情况。记住,延续操作默认情况下是在任务调度器上异步执行的,除非你使用了 TaskContinuationOptions.ExecuteSynchronously
选项。