C# 调用任务<;T>;一般方法

C# 调用任务<;T>;一般方法,c#,generics,async-await,task,C#,Generics,Async Await,Task,与……有关。我正在为服务构建一个通用异步命令执行函数 执行通用命令的方法如下所示: public async Task<object> ExecuteCommandAsync(string cmdName, CommandData data) 我担心的是这样做会否定async的价值:获取结果现在是一个阻塞调用,因此我还是使用同步方法为好。您可以等待任务完成后再思考结果 public static async Task<object> AwaitResult(Task t

与……有关。我正在为服务构建一个通用异步命令执行函数

执行通用命令的方法如下所示:

public async Task<object> ExecuteCommandAsync(string cmdName, CommandData data)

我担心的是这样做会否定async的价值:获取结果现在是一个阻塞调用,因此我还是使用同步方法为好。

您可以等待任务完成后再思考结果

public static async Task<object> AwaitResult(Task t)
{
    await t;
    return t.GetType().GetProperty("Result").GetValue(t, null);
} 

请记住,
dynamic
是可用的。只要不使用
Microsoft.Bcl.Async
,您就可以这样做:

public async Task<dynamic> ExecuteCommandAsync(string cmdName, CommandData data)
{
  MethodInfo cmd = GetMethod(cmdName);
  dynamic task = cmd.Invoke(this, data);
  return await task;
}
public async Task ExecuteCommandAsync(字符串cmdName,CommandData)
{
MethodInfo cmd=GetMethod(cmdName);
动态任务=cmd.Invoke(这个,数据);
返回等待任务;
}

特别是,我不建议使用
Task.Run
,因为那样会浪费一个线程,我也不建议使用
Task.Result
,因为它会将任何异常封装在
aggregateeexception

中,为什么不在连续调用中运行反射代码呢?您可能希望在ContinueWith之后调用unwrap,以使用
cmdName
“一对一”获取任务。@fsimonazzi不确定您的意思。@KavehShahbazian不,返回类型变化很大。知道怎么做很简单-我显然不知道!非常感谢@lee谢谢你的指点。Run是当时我唯一能想到的强制类型的方法。我通过强制转换结果稍微调整了它,所以它仍然返回object:
return(object)(等待任务) @ Quango:考虑将返回类型更改为<代码>任务< /代码>。它可以简化您的呼叫代码。
return ((dynamic)t).Result;
public async Task<dynamic> ExecuteCommandAsync(string cmdName, CommandData data)
{
  MethodInfo cmd = GetMethod(cmdName);
  dynamic task = cmd.Invoke(this, data);
  return await task;
}