【发布时间】:2017-03-04 01:58:02
【问题描述】:
我正在扩展现有的 Rpc 库以支持异步方法。
在当前的实现中,我使用工厂方法来构建类型化委托,就像这样(我省略了一些与问题无关的实现细节):
public static Func<ServiceType, PayloadType, object> BuildServiceMethodInvocation<ServiceType>(MethodInfo serviceMethod)
{
return (service, payload) =>
{
try
{
// payload is mapped onto an object[]
var parameters = ReadPayload(payload)
var result = serviceMethod.Invoke(service, parameters);
return result;
}
catch (TargetInvocationException e)
{
// bla bla bla handle the error
throw;
}
};
}
然后将生成的object 传递给序列化类,该类将处理每种情况。
现在我还想支持异步方法,即返回 Task<T> 的方法。
我想将BuildServiceMethodInvocation 的签名更改为Func<ServiceType, PayloadType, Task<object>>。
我不知道如何轻松地将每个可能的值包装在 Task<object> 中:它应该处理普通值,但也可以处理 Task<T>(装箱到对象中)。
有什么想法吗?
编辑:
serviceMethod 可以返回一个字符串,我想得到一个 Task<object> 返回字符串值。
但是 serviceMethod 可以返回一个Task<int>,在这种情况下,我想返回一个返回 int 值(装箱到对象中)的Task<object>。
【问题讨论】:
-
如果不需要异步:使用 Task.FromResult(yourObject).
-
AFAICT,Task.FromResult 不会包装 Task
类型的结果。 -
为什么需要包装Task
?可以退货吗? -
外部代码必须等待任务。我怎么知道如何等待?我该如何退货?看看我的编辑,如果它可以更好地解释问题。
-
好的,我明白你的意思了。请参阅此处了解如何执行此操作:stackoverflow.com/a/15530170/5311735
标签: c# async-await