有一种方法可以将任务作为输入并等待。
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在基类中。
答案 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;
}