如何在c#中的WinUI应用程序中实现后台轮询

问题描述 投票:0回答:1

我有一个 WinUI 应用程序,我可以在其中选择任务所需的串行端口,以便将来从中读取数据。问题是我需要在后台进行轮询,无论接口是否打开。轮询循环进行,直到通过托盘停止。也就是说,当启动应用程序或按下按钮时,应启动一个后台进程,其中将进行轮询,并且即使应用程序窗口关闭,该后台进程也将继续轮询。据我所知,PowerToys也是在WinUI上制作的,在那里按组合键打开界面是经过某种处理的,我想知道这是如何实现的

我尝试过: 1)启动线程,但当窗口关闭时它们停止,并且轮询停止。 2)启动windows服务来进行轮询,但是服务拒绝启动,就在调用

ServiceBase.Run()
时没有任何反应(也许我做错了什么)。

也许有一种方法可以在不结束程序进程的情况下隐藏窗口,并在需要时重新打开它?或者有没有其他方法可以解决这个问题。我很乐意接受任何建议

c# multithreading background-process winui-3 winui
1个回答
0
投票

要防止

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.