什么时候等待动态调用的方法?

时间:2018-06-24 18:16:39

标签: c# .net reflection async-await

当网络请求进入时,我的代码执行此操作以调用注册的方法。它是RPC系统的一部分。

Delegate method;
object result = method.DynamicInvoke(args);

当方法返回值时,一切都很好。但是,当它返回等待的内容时,我对尝试将等待的内容返回给网络调用者不感兴趣。他们不会使用它,而且它可能也无法转让。相反,我需要等待它,然后返回实际结果。

我可以检查方法的返回类型是否类似于Task。或Task<T>。够了吗?宇宙中是否还有其他可期待的事物?如何测试类型Task?我的意思是我不能做这样的事情:

method.Method.ReturnType is Task

那不是真的。而且也没有:

method.Method.ReturnType.IsAwaitable

我知道我将无法等待async void方法。但是其他所有最终可以等待的事情,都应该等待。

1 个答案:

答案 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);
}