- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 .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
事件永远不会被触发。
最佳答案
我从评论中接受了@Dai 的建议,并调查了在单独的线程上运行 WinUI 并在主线程上运行主机的情况。
我创建了一个 IHostedService
管理 WinUI 应用程序:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Microsoft.System;
using Microsoft.UI.Xaml;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace MyApp.Hosting
{
public class WinUIHostedService<TApplication> : IHostedService, IDisposable
where TApplication : Application, new()
{
private readonly IHostApplicationLifetime HostApplicationLifetime;
private readonly IServiceProvider ServiceProvider;
public WinUIHostedService(
IHostApplicationLifetime hostApplicationLifetime,
IServiceProvider serviceProvider)
{
HostApplicationLifetime = hostApplicationLifetime;
ServiceProvider = serviceProvider;
}
public void Dispose()
{
}
public Task StartAsync(CancellationToken cancellationToken)
{
var thread = new Thread(Main);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
private void Main()
{
WinRT.ComWrappersSupport.InitializeComWrappers();
Application.Start((p) => {
var context = new DispatcherQueueSynchronizationContext(DispatcherQueue.GetForCurrentThread());
SynchronizationContext.SetSynchronizationContext(context);
new TApplication();
});
HostApplicationLifetime.StopApplication();
}
}
}
我定义了
DISABLE_XAML_GENERATED_MAIN
在build设置中添加了我自己的
Main
:
public class Program
{
public static void Main(string[] args)
{
Host.CreateDefaultBuilder()
.ConfigureServices(services =>
{
services.AddHostedService<WinUIHostedService<App>>();
})
.Build().Run();
}
}
瞧!即使在
IHostedService.StopAsync
关闭主窗口时,WinUI 应用程序仍然可以正常运行并且主机会完全停止。运行异步代码。
关于c# - 与 WinUI3 一起使用时,为什么 .NET 通用主机不停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67825363/
我正在尝试制作一个在后台运行的程序,我想在 Windows 的托盘图标部分放置一个托盘图标。 我没有找到不使用 Windows 窗体的解决方案(这在 .Net 6 中是不可能的) 是否有任何其他解决方
我正在 WinUI3 UWP 中为 Windows 11 开发一个新应用程序,我想显示一个对话框以提供安全操作,如 Microsoft Docs 的这个示例:https://learn.microso
WinUI 3 有添加桌面通知的功能吗? 参见引用资料(见下文) 最佳答案 使用内置 AppNotification类: // using Microsoft.Windows.AppNotificat
当我尝试构建 MUAI 项目时,它给出错误“该项目不知道如何运行配置文件 sample.WinUI”。项目已构建但无法运行。我使用的是 Visual Studio 2022 Preview(17.0
我想不通。我只想发布/部署一个简单的 WinUI 3 应用程序。在我发布我的真实应用程序之前(我尝试发布我的完整应用程序,但我认为它可能有问题,所以我创建了一个非常小的测试应用程序,以便我可以测试发布
Microsoft 提供了多种方法来安全访问 Azure Key Vault secret ,特别是使用托管身份或服务主体作为身份提供者。但是,这些方法明确设计用于处理基于 Azure 的资源,例如
HI 再次寻求帮助;我提前道歉我已经用谷歌搜索死了,我有一个 tabView,当一个选项卡被点击时,我加载了一个页面,问题是我第一次点击任何选项卡时,内容没有加载,只有当我第二次单击任何选项卡,每个选
在我的 WinUI 3 应用程序中,我尝试使用位于另一个项目中的 ResourceDictionary。 假设引用的项目是 ResourceTestLib,并且该库项目有一个文件夹“Styles”,其
与 .NET Core 3 in preview ,可以在.NET Core平台上创建WinForms或WPF“桌面应用程序”。 使用XAML islands ,可以在 WPF 应用程序中托管 UWP
我正在尝试开始使用全新的 .NET Maui 应用程序。创建项目后,它有一个用于 MauiApp 的项目,以及另一个名为 MauiApp.WinUI 的项目。当我尝试在我的 Windows 10 设备
使用 uno-check 安装所有需要的先决条件。 在此之后我安装了 Uno Platform dotnet 模板: dotnet new -i Uno.ProjectTemplates.Dotnet
我的第一个 WinUI 3 项目。我的第二个 C# 项目。我已经能够让 FileSavePicker 工作并显示一个对话框: 我要展示的是一个 stub 程序,它只是为了解决我在使用 FileSave
我在我的应用程序中使用 WinUI 3 UWP TabView。我知道 WinUI 3 仍处于 UWP 的预览阶段。但我仍然想知道我的问题的解决方法,因为我想在我的应用程序中使用 TabView。我浏
我开始从头开始开发WinUI3应用程序到Windows 11,以便发布到Microsoft应用商店,但我在Visual Studio中找不到任何选项来创建包和上载。我为Windows10开发了几个UW
当用户在WinUI3 Windows App SDK应用程序中调整主窗口大小时,我希望强制窗口保持16:9的纵横比。我尝试在SizeChanged事件处理程序中完成此操作...
当用户在WinUI 3 Windows App SDK应用程序中调整主窗口大小时,我希望强制窗口保持16:9的宽高比。我试图在SizeChanged事件处理程序中完成它.
当用户在WinUI3 Windows App SDK应用程序中调整主窗口大小时,我希望强制窗口保持16:9的纵横比。我尝试在SizeChanged事件处理程序中完成此操作...
我是一名优秀的程序员,十分优秀!