如何定义可异步调用、返回Task<Delegate>的Getter属性?
问题分析与解决
你的代码报错核心原因有两个:
Getter要求返回Task<Delegate>,但你直接返回了Func<string, Task<object>>类型的委托,没有将其包装为Task对象- 你定义的内部委托标注了要执行异步调用,但代码没有使用
async/await,返回值也不是Task<object>类型
正确写法分两种场景:
场景1:创建委托的过程是同步的
如果只是需要异步返回委托(创建委托本身不需要异步操作),用Task.FromResult将委托包装进Task:
new DelAccessor() { Getter = service => { // 定义带异步逻辑的委托 Func<string, Task<object>> targetFunc = async t => { var v = new object(); // 执行异步操作,比如 await service.DoAsyncWork(t); return v; }; // 将委托包装为Task<Delegate>返回 return Task.FromResult<Delegate>(targetFunc); } };
场景2:创建委托的过程本身需要异步操作
如果需要先通过IService执行异步操作,再基于结果创建委托,直接用async/await修饰lambda:
new DelAccessor() { Getter = async service => { // 先执行异步操作获取初始化数据 var initData = await service.FetchInitDataAsync(); // 基于异步获取的数据创建委托 Func<string, Task<object>> targetFunc = async t => { var v = new object(); // 结合initData执行异步逻辑,比如 await service.ProcessAsync(initData, t); return v; }; // async方法会自动将返回的Delegate包装为Task<Delegate> return targetFunc; } };
额外注意点
- 内部的异步委托必须用
async修饰,返回Task<object>而非直接返回object,否则无法正确执行异步逻辑 - 调用时保持你原来的写法即可:
var myDelegate = await a.Getter(service);,后续可以将myDelegate强制转换为具体的委托类型(比如Func<string, Task<object>>)再调用
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

