【发布时间】:2019-04-24 07:38:04
【问题描述】:
我不确定以前是否有人问过这种问题。我正在学习异步方法。
JobAsync 是异步方法的一个简单示例,Do 接受 Action 类型的委托,而 Main 只调用 Do,后者又通过异步 lambda 调用 JobAsync。有关详细信息,请参阅下面的代码。
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这种现象?
任何建议或cmets总是受欢迎的!如果Do来自第三方库,我们怎么知道不能给它传递异步方法呢?
编辑
经验法则是“不要将异步方法作为非异步方法的Func<...,Task 或Func<...,Task<...>> 以外的类型的参数传递?”
【问题讨论】:
标签: c# asynchronous async-await