如何从Task获取返回值?Task<TResult>语法及编译问题求助
带返回值的Task与ContinueWith语法问题
我有一个需要返回值的Task,要将返回值传递给ContinueWith方法,但不清楚Task
当前代码
var task = new Task(CreateAction(token), token, TaskCreationOptions.AttachedToParent); task.ContinueWith(_ => {/*...*/}); //... Action CreateAction(CancellationToken cancellationToken) { return async () => { //... // 需要修改此方法以返回bool值 } }
尝试修改后无法编译的代码
var task = new Task<bool>(CreateAction(token), token, TaskCreationOptions.AttachedToParent); task.ContinueWith((theReturnValue) => {/*...*/}); //... Func<bool> CreateAction(CancellationToken cancellationToken) { return async () => { //... return true; // 示例硬编码返回值 } }
问题原因与解决方案
你的代码编译失败的核心原因是:async修饰的匿名方法返回值会被编译器自动包装为TaskFunc<bool>实际上会被隐式转换为Func<Task<bool>>,但创建Task<bool>时要求传入的委托是Func<bool>(同步返回bool),类型不匹配导致编译错误。
正确写法
修改CreateAction的返回类型为Func<Task<bool>>,并通过Unwrap()展开嵌套的Task,这样就能在ContinueWith中获取到最终的bool返回值:
var task = new Task<Task<bool>>(CreateAction(token), token, TaskCreationOptions.AttachedToParent).Unwrap(); task.ContinueWith(t => { bool result = t.Result; // 在这里处理返回值 }); //... Func<Task<bool>> CreateAction(CancellationToken cancellationToken) { return async () => { // 执行你的异步操作,比如await某个任务 await Task.Delay(100); return true; // 返回实际的bool结果 } }
更简洁的替代方案(推荐)
如果业务场景允许,直接使用Task.Factory.StartNew结合Unwrap,可以避免手动创建嵌套Task:
var task = Task.Factory.StartNew(CreateAction(token), token, TaskCreationOptions.AttachedToParent, TaskScheduler.Current).Unwrap(); task.ContinueWith(t => { bool result = t.Result; // 处理逻辑 }); //... Func<Task<bool>> CreateAction(CancellationToken cancellationToken) { return async () => { await Task.Delay(100); return true; } }
关键说明
- 当委托包含
async修饰时,必须确保委托的返回类型与async方法的实际返回值匹配:async方法返回Task<T>对应Func<Task<T>>,返回Task对应Func<Task>。 - 使用
Unwrap()可以将Task<Task<T>>转换为Task<T>,简化后续对返回值的处理。
内容的提问来源于stack exchange,提问作者user20543568
相关产品推荐
相关产品推荐

