【发布时间】:2023-03-13 06:55:01
【问题描述】:
与Casting TResult in Task<TResult> to System.Object 相关。我正在为服务构建一个通用的异步命令执行功能。
执行通用命令的方法如下所示:
public async Task<object> ExecuteCommandAsync(string cmdName, CommandData data)
代码使用反射在具有给定cmdName 的类上查找方法。调用它会返回一个Type<T>——我们事先并不知道T。但是由于Task<T> 不是协变的,我不能转换为Task<object>。
目前我的解决方案(按照21805564)是调用Result方法,封装在一个Task.Run中,如下图:
// find the method
MethodInfo cmd = GetMethod(cmdName);
var task = (Task)cmd.Invoke(this, data);
return await Task.Run<object>(() => { return task.GetType().GetProperty("Result").GetValue(task); });
我担心这样做会否定 async 的价值:获取结果现在是一个阻塞调用,所以我还不如使用同步方法。
【问题讨论】:
-
为什么不在 ContinueWith 调用中运行反射代码?您可能需要在 ContinueWith 之后调用 unwrap 以获取 Task
-
T是否与cmdName一对一? -
@fsimonazzi 不确定你的意思。
-
@KavehShahbazian 不,返回类型变化很大。
标签: c# generics async-await task