await使用.Net中的反射来存储应用程序

时间:2015-03-24 08:10:26

标签: c# windows-store-apps async-await system.reflection

有一种方法可以将任务作为输入并等待。

protected async Task DoTask(Task t)
{
  //Do something
  await t;
} 

第二种方法将接受字符串格式的方法名称,并使用Reflection创建方法对象。需要创建任务而不是调用它并将其传递给第一个方法 这两种方法是基类的一部分。作为视图模型的子类将调用DoTask2并传递其自身内定义的函数的名称(即视图模型)。

protected async Task DoTask2(string method)
        {Task t = null;
            var typeInfo = this.GetType().GetTypeInfo();
            var methods = typeInfo.DeclaredMethods;
            var meth = methods .Single(o => String.Equals(o.Name, method));

            t = meth .Invoke(this, null) as Task;   

      await DoTask(t);
}

但这不能正常运作。这种方法在这里有问题。

我正在尝试在Windows 8.1商店应用中构建它 编辑: 在执行此行时,而是获取Task对象,将调用异步方法。我需要得到任务,以便我可以将它传递给下一个方法。

我想使用反射来获取方法,但是使用我的doTask方法将其创建为新的Task执行。所有方法都属于同一类。 Dotask和Dotask2在基类中。

1 个答案:

答案 0 :(得分:1)

我认为这里的主要问题是期望;

  

我想使用反射来获取方法,但是使用我的doTask方法将其创建为新的Task执行。

这并不是大多数异步API 的工作方式;调用async方法:正在执行async方法 - 或者更具体地说,它正在执行该方法,直到报告为不完整的第一个延续。调用async方法只是为方法创建一个尚未启动的令牌。我想知道你是否真的想要一个Func<Task>而不是一个Task - Func<Task>是一个委托,当被调用时返回一个Task - 但是没有调用它。有一些方法可以直接从常规.NET中的Func<T>创建MethodInfo,但在windows-store应用程序中,您可能需要是间接的:

Func<Task> invoker = () => (Task)meth.Invoke(this, null);

然后你会:

private async Task DoTask(Func<Task> invoker)
{
  var t = invoker(); //Do something code goes somewhere in this method
  await t;
}