在使用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尚未完全加载,但是我找不到任何有关它的信息。任何人都可以带来一些启发吗?
亲切的问候。
答案 0 :(得分:1)
无论何时出现等待,您的方法都会被分为2:等待之前和等待之后(虽然不是100%准确,但是足够接近)。一旦完成了等待的操作,将执行“第二”方法,当等待的操作返回可等待的时,“第一”部分将返回。 为了使整个方法调用链都等待“第二”部分,您需要在调用树上的每个等待的方法上进行等待。
答案 1 :(得分:0)
您正在等待传递给WithParsed
和WithNotParsed
的异步方法。您无需等待async Main
方法内的任何地方。
先解析您的args,然后解析Main中的await wtgValuesCalculator.Calculate
。
换句话说:目前,您将两个异步方法发送到WithParsed / WithNotParsed,然后继续而不等待Main。您的await
仅在WithParsed / WithNotParsed委托的上下文中。