我不确定以前是否曾问过这种问题。我正在学习异步方法。
JobAsync
是异步方法的一个简单示例,Do
接受类型为Action
的委托,而Main
仅调用Do
,后者依次调用JobAsync
通过异步lambda。有关详细信息,请参见下面的代码。
class Program
{
static async Task JobAsync()
{
Console.WriteLine("Begin JobAsync");
await Task.Delay(5000);
Console.WriteLine("End JobAsync");
}
static void Do(Action a)
{
Console.WriteLine("Begin Do");
a();
Console.WriteLine("End Do");
}
static async Task Main()
{
Console.WriteLine("Begin Main");
Do(async () => await JobAsync());
Console.WriteLine("End Main");
}
}
在下面的输出中,
开始
开始做
开始JobAsync
结束做
结束主要
End JobAsync
不存在。
是什么原因导致输出中不存在End JobAsync
的现象?
始终欢迎任何建议或评论!如果Do
来自第三方库,我们怎么知道我们不能将异步方法传递给它?
经验法则是“不要将异步方法作为非异步方法的Func<...,Task
或Func<...,Task<...>>
以外类型的参数传递?”
答案 0 :(得分:1)
您的异步方法返回一个Task,因此您应该使用Func<Task>
而不是Action
。然后,您必须等待任务。
static async Task Do(Func<Task> a)
{
Console.WriteLine("Begin Do");
await a(); //Notice we await the result here
Console.WriteLine("End Do");
}