首页 > 解决方案 > 通过反射在抽象类中调用异步任务

问题描述

我正在尝试使用反射来异步运行任务。问题是这个类是抽象的。我让它InvokeMember在同步上下文中工作。使用 async 由于某种原因找不到该方法..所以这就是我想出的。它不起作用,因为我无法将抽象类的对象传递给 Invoke 方法.. 死胡同?

public MyClass
{
  public async Task<string> MyMethod()
  { 
    var tasks = new List<Task>();

    for (int i = 0; i < 3; i++)
    {
       string taskType = "Banana"; // should be an array[i] 
       Type type = Type.GetType("MyService." + taskType);
       var method = type.GetMethod("Test");

       var result = (Task<string>)method.Invoke(null, null);

       tasks.Add(result);
    }    
    await Task.WhenAll(tasks);
  }
}

例如,上面的“taskType”是一个如下所示的类:

public abstract class Banana
{
    public async Task<string> Test(string input)
    {
        await Task.Delay(5000);
        return "foo";
    }
}

标签: c#asp.net-coreasynchronous

解决方案


我们已经在评论中讨论过这个问题,但也许下面的代码会给你一个更好的主意。

public class MyClass
{
  public async Task<string> MyMethod()
  { 
    var tasks = new List<Task>();

    for (int i = 0; i < 3; i++)
    {
       string taskType = "Banana"; // should be an array[i] 
       Type type = Type.GetType("MyService." + taskType);
       var method = type.GetMethod("Test");

       var result = (Task)method.Invoke(null, null);

       tasks.Add(result);
    }
    await Task.WhenAll(tasks);

    var theResult = string.Empty;
    foreach(var task in tasks)
    {
      theResult += (string)task.GetType().GetProperty("Result").GetValue(task);
    }

    return theResult;
  }
}

我已经完全盲目地编写它并且无法测试它 - 请耐心等待!

但总体思路如下:具体的异步方法是 of Task<string>,但我找不到调用异步泛型方法的方法。但是由于 everyTask<T>是非泛型的Task,我们可以转换为它并等待它。每个元素tasks都是 a的附加知识Task<string>允许我们Result通过反射检索其属性。


推荐阅读