我有一个 WinUI 应用程序,我可以在其中选择任务所需的串行端口,以便将来从中读取数据。问题是我需要在后台进行轮询,无论接口是否打开。轮询循环进行,直到通过托盘停止。也就是说,当启动应用程序或按下按钮时,应启动一个后台进程,其中将进行轮询,并且即使应用程序窗口关闭,该后台进程也将继续轮询。据我所知,PowerToys也是在WinUI上制作的,在那里按组合键打开界面是经过某种处理的,我想知道这是如何实现的
我尝试过: 1)启动线程,但当窗口关闭时它们停止,并且轮询停止。 2)启动windows服务来进行轮询,但是服务拒绝启动,就在调用
ServiceBase.Run()
时没有任何反应(也许我做错了什么)。
也许有一种方法可以在不结束程序进程的情况下隐藏窗口,并在需要时重新打开它?或者有没有其他方法可以解决这个问题。我很乐意接受任何建议
要防止
Window
关闭,可以使用 Closing 事件:
App.xaml.cs
private void AppWindow_Closing(AppWindow sender, AppWindowClosingEventArgs args)
{
args.Cancel = true;
sender.Hide();
}
要进行轮询,您可以使用 PeriodicTimer:
App.xaml.cs
private async Task StartBackgroundTask(CancellationToken cancellationToken = default)
{
using PeriodicTimer timer = new(TimeSpan.FromSeconds(3));
try
{
// ConfigureAwait(false) will release the UI thread and allow the background task to run on a different thread.
while (await timer.WaitForNextTickAsync(cancellationToken).ConfigureAwait(false) is true)
{
// Do your logic for the serial port here.
// If you need to update the UI, you can use the DispatcherQueue of the window.
_window?.DispatcherQueue.TryEnqueue(() =>
{
if (_window.AppWindow.IsVisible is false)
{
_window.AppWindow.Show();
}
});
}
}
catch (OperationCanceledException)
{
System.Diagnostics.Debug.WriteLine("Background task was cancelled.");
}
catch (Exception exception)
{
System.Diagnostics.Debug.WriteLine(exception);
}
}
private CancellationTokenSource CancellationTokenSource { get; } = new();
protected override async void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
_window = new MainWindow();
_window.AppWindow.Closing += AppWindow_Closing;
_window.Activate();
await StartBackgroundTask(CancellationTokenSource.Token);
}