【问题标题】:How to get task result from awaiting a non generic task如何从等待非通用任务中获取任务结果
【发布时间】:2017-02-20 13:27:31
【问题描述】:

我有以下方法:

public async Task Execute()
{
    object previous = null;

    // _delegates is of type IReadOnlyCollection<Delegate>
    foreach (Delegate method in _delegates) 
    {
        Task executing = (Task) (previous != null
           ? method.DynamicInvoke(_repository, previous)
           : method.DynamicInvoke(_repository);

        await executing;

        // pseudo code here
        if (executing returns something)
           previous = executing.Result //<-- ?
        else
           previous = null;
    }
}

基本上,我会遍历我按顺序执行的委托列表。每个委托都接收一个存储库作为参数,以及前一个委托的返回值(如果有的话)。

有些代表返回Task,有些返回Task&lt;TResult&gt;。如果遇到后者,我想将 TResult 值存储在 previous 中,以便将其作为参数传递给下一个委托。

有没有办法做到这一点?

【问题讨论】:

    标签: c# .net delegates task


    【解决方案1】:

    如果你需要添加强制转换:

    if (executing returns something)
        previous = ((Task<object>)executing).Result
    else
        previous = null;
    

    【讨论】:

    【解决方案2】:

    您可以使用反射检查executing对象的类型是否为Task&lt;T&gt;,如果是这样,则读取“结果”属性:

    var taskType = executing.GetType();
    
    bool isTaskOfT =
        taskType.IsGenericType
        && taskType.GetGenericTypeDefinition() == typeof(Task<>);
    
    if (isTaskOfT)
    {
        object result = taskType.GetProperty("Result").GetValue(executing);
    }
    

    【讨论】:

    • 我将对此进行测试并告诉你。谢谢!
    • 我只是在尝试类似的东西:) 好一个
    • 只是一个警告,此检查无法可靠地确定任务,具体取决于运行时,例如可以是System.Runtime.CompilerServices.AsyncTaskMethodBuilder1+Asyn‌​cStateMachineBox1[TR‌​esult,TStateMachine]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2016-10-15
    • 2016-06-15
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多