У меня есть довольно стандартный код для типичного .NET Core 2+ program.cs
.В основном я настраиваю ведение журнала.
С приведенным ниже кодом это не async/await
, и происходит следующее:
- Регистрация происходит во время процесса запуска 100%.
-
CloseAndFlush();
происходит почти мгновенно, до того, как все остальное приложение выполняет. - В каких-либо контроллерах не ведется регистрация.
Отчасти это связано с тем, как Serilogработает, но это не очень важный бит, AFAIK.
Код переходит прямо на return CreateWebHostBuilder(args).Build().RunAsync();
.. когда я подумал, что это та часть, где он будет awaited
вызывающим?Когда я отлаживаю свое приложение, оно ожидает (зависает) в этой строке ... пока приложение не завершит завершение .Как только он готов принимать соединения, он возвращается сюда ... и проходит через ... что означает, что он вызывает Log.CloseAndFlush()
, а затем return Task.CompletedTask
.
Код ошибки:
public static Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()....CreateLogger();
try
{
// awaits here until the app has 100% started, then continues.
return CreateWebHostBuilder(args).Build().RunAsync();
}
catch (Exception exception)
{
Log.Logger.Fatal(exception, "Host terminated unexpectantly. Sadness :~(");
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
Log.CloseAndFlush();
}
return Task.CompletedTask;
}
Теперь изменив это на async/await
, все исправляется.Код правильно ожидает на return CreateWebHostBuilder(args).Build().RunAsync();
.. и затем CloseAndFlush()
вызывается, когда приложение закрывается / завершается.
public static async Task Main<T>(string[] args) where T : class
{
Log.Logger = new LoggerConfiguration()....CreateLogger();
try
{
// Correctly waits here until the app explodes or ctrl-c has been pressed.
await CreateWebHostBuilder<T>(args).Build().RunAsync();
}
catch (Exception exception)
{
Log.Error(exception, "Stopped program because of an exception.");
}
Log.Debug("Finished shutting down app.");
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
Log.CloseAndFlush();
}
Возврат задачи, вероятно, будет только подходящимесли метод только делает one async/await
в нем И это последнее в методе?