.NET 4.0环境下Task调用ContinueWith访问Result属性报编译错误如何解决?
错误原因分析
你遇到的编译错误是因为Task.Factory.StartNew的重载匹配问题:
- 你的
_someObject.Start()方法返回bool值,按逻辑应该返回泛型类型Task<bool>,该类型才有Result属性 - 但.NET 4.0的重载匹配规则下,你当前的写法命中了非泛型的
StartNew重载,返回值是基础类Task,这个类本身没有定义Result属性,因此编译器抛出CS1061错误。
解决方案
有两种常用修改方式可以解决问题:
方式1:显式指定StartNew的泛型参数
强制调用泛型版本的StartNew<TResult>重载,直接返回Task<bool>类型:
Task.Factory.StartNew<bool>( () => _someObject.Start(), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default) .ContinueWith( prevTask => FollowUpAction(prevTask.Result), Dispatcher.CurrentDispatcher);
方式2:显式声明前序任务类型
通过变量声明强制编译器做类型校验,触发正确的泛型重载匹配:
Task<bool> workerTask = Task.Factory.StartNew( () => _someObject.Start(), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); workerTask.ContinueWith( prevTask => FollowUpAction(prevTask.Result), Dispatcher.CurrentDispatcher);
注意事项
.NET 4.0中任务未捕获的异常会在垃圾回收时触发进程崩溃,建议在ContinueWith的回调中补充异常处理逻辑,判断前序任务的IsFaulted、IsCanceled属性,避免未处理异常。
内容的提问来源于stack exchange,提问作者Santhosh Kumar
相关产品推荐
相关产品推荐

