我正在使用 .NET 5 编写一个 WinUI3 (Project Reunion 0.5) 应用程序,并希望使用 .NET 通用主机。我正在使用带有自定义的默认主机IHostedService
:
public App() {
_host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddHostedService<MyHostedService>();
}).Build();
InitializeComponent();
}
托管服务在StopAsync
. 出于演示目的,假设它延迟 1 秒(此代码仍然会产生问题):
public override async Task StopAsync(CancellationToken cancellationToken)
{
await Task.Delay(1000);
}
我在以下位置启动主机OnLaunched
:
protected override async void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
await _host.StartAsync();
m_window = new MainWindow();
m_window.Activate();
}
我让默认ConsoleLifetime
实现在进程退出之前停止主机。
Task
我的实现返回的完成IHostedService.StopAsync
,但IHost.StopAsync
永远不会返回,并且该过程在输出中挂起此消息:
Microsoft.Hosting.Lifetime: Information: Application is shutting down...
Microsoft.Hosting.Lifetime: Information: Waiting for the host to be disposed. Ensure all 'IHost' instances are wrapped in 'using' blocks.
如果我使用调试器单步执行,有时该IHost.StopAsync
方法会超时并引发异常。这永远不会在调试器之外发生。我已经尝试在关闭时明确停止和处置主机MainWindow
,但这没有任何区别。
我想也许在DispatcherQueueSynchronizationContext
主机可以停止并且任务没有得到服务之前被关闭,但该DispatcherQueue.ShutdownStarting
事件从未被触发。
还有其他想法吗?