c# - 当我的 .NET 代码返回一个任务时,它并没有达到预期的结果。将其更改为异步/等待,修复它。为什么?
问题描述
我有一些典型的 .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();
}
如果方法只在其中做一个 async/await
并且这是方法中的最后一件事,返回 Task 可能只适合吗?
解决方案
如果该方法只在其中执行一个异步/等待并且这是该方法中的最后一件事,那么返回一个任务可能只适合吗?
基本上,是的。在您的第一个片段中返回任务将使 finally 块在您离开范围时运行,就像 try 中带有关联 finally 的任何其他 return 语句一样。正如 ckuri 所评论的那样,您的 catch 块也不会执行您想要的操作,因为它不会从任务中捕获异常,而只会从设置CreateWebHostBuilder
本身中捕获异常。
推荐阅读
- php - 需要将我当前的 php curl 代码重写为基本身份验证
- reporting-services - 计算 SSRS 矩阵表中的平均值以及过滤列以区分当前年份与前几年
- python-3.x - 当我使用熊猫阅读 excel 时,如何删除上标?
- r - data.table 为唯一观察赋值
- sql - 字母数字排序
- excel - 如何修复 Excel-VBA 中的“运行时错误 '13':类型不匹配”错误?
- r - R将包含日期的列名转换为“月年”格式
- python - 简化 z3 位向量表达式,但避免提取和连接
- python - 在 Keras 顺序模型中使用的 epoch 数
- amazon-web-services - CloudTrail - CloudTrail 管理事件中的 sourceIPAddress 字段