这个问题在这里已有答案:
我不确定以前是否曾经问过这种问题。我正在学习异步方法。
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");
}
}
。有关详细信息,请参阅下面的代码。
End JobAsync
在下面的输出中,
开始主要
开始吧
开始JobAsync
结束做
结束主要
End JobAsync
不存在。
是什么原因导致Do
在输出中不存在的现象?
欢迎任何建议或意见!如果Func<...,Task
来自第三方库,我们怎么知道我们不能将异步方法传递给它?
经验法则“不要将异步方法作为非异步方法的Func<...,Task<...>>
或Func<Task>
以外的类型的参数传递吗?”
你的异步方法返回一个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");
}
。然后你必须等待任务。
qazxswpoi