Main中的异步方法立即返回

时间:2019-01-14 14:26:09

标签: c# .net-core async-await

在使用c#7.3级的net core 2.2应用程序中,我具有以下Main

    public static async Task Main(string[] args)
    {
        _logger.TraceMethodBegins(nameof(Main));
        AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
        TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
        using (ServiceFactory.Instance)
        {
            try
            {
                Parser.Default.ParseArguments<Options>(args)
                    .WithParsed(async o =>
                    {
                        IWtgValuesCalculator wtgValuesCalculator = ServiceFactory.Instance.Kernel.Get<IWtgValuesCalculator>();
                        await wtgValuesCalculator.Calculate(o.StartDate, o.EndDate, o.FacilityName);
                    })
                    .WithNotParsed(async o =>
                    {
//Code enters over here
                        IWtgValuesCalculator wtgValuesCalculator = ServiceFactory.Instance.Kernel.Get<IWtgValuesCalculator>();
                        await wtgValuesCalculator.Calculate(null, null, null);
                    });
            }
            catch (Exception e)
            {
                _logger.Fatal(e, e.Message);
            }
        }
//And jump here immediately without awaiting
        _logger.TraceMethodEnds(nameof(Main));
    }

该方法将立即返回,而无需等待await wtgValuesCalculator.Calculate()我已确认没有异常,如果将其更改为使用所有同步方法,程序将按预期运行。另外,调用wtgValuesCalculator.Calculate(o.StartDate, o.EndDate, o.FacilityName).GetAwaiter().GetResult();使其正确运行。一位同事告诉我,他读过某处文章说Main中的异步方法可能有问题,因为mscorlib尚未完全加载,但是我找不到任何有关它的信息。任何人都可以带来一些启发吗? 亲切的问候。

2 个答案:

答案 0 :(得分:1)

无论何时出现等待,您的方法都会被分为2:等待之前和等待之后(虽然不是100%准确,但是足够接近)。一旦完成了等待的操作,将执行“第二”方法,当等待的操作返回可等待的时,“第一”部分将返回。 为了使整个方法调用链都等待“第二”部分,您需要在调用树上的每个等待的方法上进行等待。

答案 1 :(得分:0)

您正在等待传递给WithParsedWithNotParsed的异步方法。您无需等待async Main方法内的任何地方。

先解析您的args,然后解析Main中的await wtgValuesCalculator.Calculate

换句话说:目前,您将两个异步方法发送到WithParsed / WithNotParsed,然后继续而不等待Main。您的await仅在WithParsed / WithNotParsed委托的上下文中。