我是使用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();
}
}
我知道这不是从“顶部”异步运行的。 由于无法在Main
方法上指定async
修饰符,因此如何在main
异步运行代码?
#1楼
您还可以通过执行以下操作来执行此操作,而无需外部库:
class Program
{
static void Main(string[] args)
{
Bootstrapper bs = new Bootstrapper();
var getListTask = bs.GetList(); // returns the Task<List<TvChannel>>
Task.WaitAll(getListTask); // block while the task completes
var list = getListTask.Result;
}
}
#2楼
在Main中,尝试将对GetList的调用更改为:
Task.Run(() => bs.GetList());
#3楼
对于从Main异步调用任务,请使用
适用于.NET 4.5的Task.Run()
.NET 4.0的Task.Factory.StartNew()(可能需要Microsoft.Bcl.Async库用于async和await关键字)
详细信息: http : //blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
#4楼
您可以使用以下简单结构解决此问题:
class Program
{
static void Main(string[] args)
{
Task.Run(async () =>
{
// Do any async anything you need here without worry
}).GetAwaiter().GetResult();
}
}
这会将您执行的所有操作放在所需的ThreadPool上(因此,您启动/等待的其他任务不会尝试重新加入不应执行的线程),并等待所有操作完成后再关闭控制台应用程序。 不需要特殊的循环或外部库。
编辑:合并未捕获的异常的安德鲁的解决方案。
#5楼
并不需要那么多,但是当我使用控制台应用程序进行快速测试并需要异步时,我就这样解决了它:
class Program
{
static void Main(string[] args)
{
MainAsync(args).Wait();
}
static async Task MainAsync(string[] args)
{
// Code here
}
}
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3162732