ContinueWith方法详解:如何准确理解其参数机制?
关于ContinueWith中参数的疑问解答
好问题!这其实是很多刚接触Task异步编程的开发者容易混淆的点,我给你讲明白:
ContinueWith里的argument参数就是原Task实例(也就是你代码中的initialTask),.NET不会在这里创建全新的Task对象,它直接把已经完成的初始Task实例传递给后续的委托。至于取消状态的判断:不管你调用
initialTask.IsCanceled还是argument.IsCanceled,结果都是完全一致的——因为它们指向同一个对象。不过从代码的可读性、可维护性和最佳实践角度来说,更推荐使用argument.IsCanceled:- 如果你后续把这段后续任务的逻辑抽成独立的方法,依赖传入的参数会让方法更通用,不耦合外部的
initialTask变量; - 万一后续修改了初始Task的变量名,用传入的参数也不会出现引用错误。
- 如果你后续把这段后续任务的逻辑抽成独立的方法,依赖传入的参数会让方法更通用,不耦合外部的
举个简单的代码验证例子:
var cts = new CancellationTokenSource(); var initialTask = Task.Run(() => { cts.Token.ThrowIfCancellationRequested(); }, cts.Token); // 立即取消初始任务 cts.Cancel(); initialTask.ContinueWith(argument => { Console.WriteLine($"initialTask.IsCanceled: {initialTask.IsCanceled}"); Console.WriteLine($"argument.IsCanceled: {argument.IsCanceled}"); // 输出结果都是True,因为是同一个实例 });
内容的提问来源于stack exchange,提问作者Philipp Elhaus
相关产品推荐
相关产品推荐

