我的一位同事正在开发一个控制台应用程序,我们遇到了一些麻烦。启动应用程序只会弹出一个空的控制台窗口,然后该窗口会立即关闭。
不会遇到断点。任何地方都不会记录任何错误。无输出。
经过几分钟的摸索,我发现他的应用程序无法运行的原因是由于他的主要
IHostedService
的依赖项未注册。很简单就能修复。
我想知道的是; 为什么控制台没有记录任何异常或错误?这会让我们的生活变得更加轻松。
示例(非常快速地敲在一起):
//[Program.cs]
namespace FooNamespace
{
internal class Program
{
static void Main(string[] args)
{
var hostBuilder = Host.CreateDefaultBuilder(args)
.UseConsoleLifetime()
.ConfigureServices((_, services) =>
{
services.AddHostedService<FooHostedService>();
//Missing dependency
//services.AddSingleton<IFooDependency, FooDependency>();
});
hostBuilder.RunConsoleAsync();
}
}
}
// [FooHostedService.cs]
namespace FooNamespace
{
internal class FooHostedService : IHostedService
{
private IFooDependency FooDependency { get; }
public FooHostedService(IFooDependency fooDependency)
{
FooDependency = fooDependency;
}
public Task StartAsync(CancellationToken cancellationToken)
{
//If the program were working, this should display a string and pause for input
Console.WriteLine("Hello, world!");
Console.ReadKey(true);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}
首先,您缺少 await RunConsoleAsync 方法。 这应该足够了。
此外,我建议您使用日志库作为Serilog:https://github.com/serilog/serilog/wiki/Configuration-Basics
这是一个例子:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
namespace FooNamespace
{
internal class Program
{
static async Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateBootstrapLogger();
try
{
var hostBuilder = Host.CreateDefaultBuilder(args)
.UseConsoleLifetime()
.ConfigureServices((_, services) =>
{
services.AddHostedService<FooHostedService>();
//Missing dependency
//services.AddSingleton<IFooDependency, FooDependency>();
});
await hostBuilder.RunConsoleAsync();
}
catch (Exception ex)
{
Log.Fatal(ex, ex.Message);
}
finally
{
Log.CloseAndFlush();
}
}
}
}
在这种情况下,您还会记录其他类型的问题,例如主机构建问题。请参阅:https://nblumhardt.com/2020/10/bootstrap-logger/