当网络请求进入时,我的代码执行此操作以调用注册的方法。它是RPC系统的一部分。
Delegate method;
object result = method.DynamicInvoke(args);
当方法返回值时,一切都很好。但是,当它返回等待的内容时,我对尝试将等待的内容返回给网络调用者不感兴趣。他们不会使用它,而且它可能也无法转让。相反,我需要等待它,然后返回实际结果。
我可以检查方法的返回类型是否类似于Task
。或Task<T>
。够了吗?宇宙中是否还有其他可期待的事物?如何测试类型Task
?我的意思是我不能做这样的事情:
method.Method.ReturnType is Task
那不是真的。而且也没有:
method.Method.ReturnType.IsAwaitable
我知道我将无法等待async void
方法。但是其他所有最终可以等待的事情,都应该等待。
答案 0 :(得分:1)
编译器知道什么是可以期待的。您需要将其固定在您知道如何处理的类型上。
尝试这样的事情:
object result = null;
if (method.Method.ReturnType.IsSubclassOf(typeof(Task)))
{
if (method.Method.ReturnType.IsConstructedGenericType)
{
dynamic tmp = method.DynamicInvoke(args);
result = tmp.GetAwaiter().GetResult();
}
else
{
(method.DynamicInvoke(args) as Task).GetAwaiter().GetResult();
}
}
else
{
result = method.DynamicInvoke(args);
}