gpt4 book ai didi

c# - 当我的 .NET 代码返回一个任务时,它没有达到预期的结果。将其更改为异步/等待,修复它。为什么?

转载 作者:太空宇宙 更新时间:2023-11-03 20:52:56 27 4
gpt4 key购买 nike

我有一些典型的 .NET Core 2+ program.cs 的标准代码。我主要设置日志记录。

使用下面的代码,它不是 async/await 并且会发生以下情况:

  • 日志记录 100% 发生在启动过程中。
  • CloseAndFlush(); 几乎立即发生,在应用程序的其余部分执行操作之前。
  • 在任何 Controller 中都不会发生日志记录。

这部分是由于 Serilog 的工作方式,但这并不是真正重要的一点,AFAIK。

代码直接越过 return CreateWebHostBuilder(args).Build().RunAsync(); .. 当我认为这是 awaited 的部分时由来电者?当我调试我的应用程序时,它会等待(挂起)在那一行……直到应用程序完成启动。一旦准备好接受连接,它就会返回此处...并运行...这意味着它会调用 Log.CloseAndFlush(),然后 返回 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 并且这是方法中的最后一件事,返回任务是否可能仅适用?

最佳答案

返回一个 Task1 而不是 await 这是你说“this 此处执行的方法"2

如果不是这种情况(如此处,您还不想运行 finally 子句),您还没有完成。您需要某种方式在以后的某个时间点运行一些代码,但现在您没有任何有用的事情可做。而这正是 await 允许您发出的信号。


1作为Jonas mentions ,对于非 Task 返回也是如此。

2当您从别处获取一个Task,添加一个ContinueWith 并返回结果Task 时,我将忽略这种情况,因为您正在使用不同的机制来确保您稍后可以运行代码,并且它不是准确地在延续中运行的“此方法”。

关于c# - 当我的 .NET 代码返回一个任务时,它没有达到预期的结果。将其更改为异步/等待,修复它。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53442791/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com