无法在控制台应用程序的“主要”方法上指定“异步”修饰符

别来无恙 提交于 2020-02-27 01:34:42

我是使用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异步调用任务,请使用

  1. 适用于.NET 4.5的Task.Run()

  2. .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
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!