我是使用async修饰符进行异步编程的新手.我试图弄清楚如何确保我Main的控制台应用程序的方法实际上异步运行.
class Program
{
static void Main(string[] args)
{
Bootstrapper bs = new Bootstrapper();
var list = bs.GetList();
}
}
public class Bootstrapper {
public async Task<List<TvChannel>> GetList()
{
GetPrograms pro = new GetPrograms();
return await pro.DownloadTvChannels();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这不是从"顶部"异步运行的.由于无法async在Main方法上指定修饰符,如何在main异步中运行代码?
在Stephan Cleary最近关于.NET CoreCLR上的异步控制台应用程序的博客文章中,他向我们展示了在CoreCLR中(目前在Visual Studio 2015上运行,CTP6),入口点"Main"实际上可以标记为async Task,正确编译并实际运行:
public class Program
{
public async Task Main(string[] args)
{
Console.WriteLine("Hello World");
await Task.Delay(TimeSpan.FromSeconds(1));
Console.WriteLine("Still here!");
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
给出以下输出:

这是由ASP.NET团队的一篇名为"深度潜入"的博客文章强化到ASP.NET 5运行时:
除了静态
Program.Main入口点之外,KRE还支持基于实例的入口点.您甚至可以使主入口点异步并返回任务.通过使主入口点成为实例方法,您可以将运行时环境中的服务注入到应用程序中.
我们知道,到目前为止,无法使用'async'修饰符标记入口点.那么,在新的CoreCLR运行时中,这实际上是如何实现的呢?