.net 如何在窗口处于活动和非活动状态时停止和启动方法

ds97pgxw  于 2023-04-08  发布在  .NET
关注(0)|答案(1)|浏览(163)

我正在尝试实现一个持续运行的方法,只要应用程序的窗口处于活动状态,如果窗口最小化,则该方法应该停止。
我使用的是MVVM架构。
在我后面的代码中,我有这个方法:

protected override void OnAppearing()
    {
        if (BindingContext is MainPageViewModel vm)
        {
            vm.Init();
        }
    }

我编辑了生命周期事件。

public partial class App : Application
{
    public static bool activeWindow;

    public App()
    {
        InitializeComponent();

        MainPage = new AppShell();
    }

    protected override Window CreateWindow(IActivationState activationState)
    {
        Window window = base.CreateWindow(activationState);

        window.Activated += (s, e) => { activeWindow = true; };
        window.Deactivated += (s, e) => { activeWindow = false; };

            return window;
    }

在我的视图模型中:

public async void Init()
    {
        await RunInBackground(TimeSpan.FromSeconds(1));
    }

    async Task RunInBackground(TimeSpan timeSpan)
    {
        var periodicTimer = new PeriodicTimer(timeSpan);
        while (await periodicTimer.WaitForNextTickAsync())
        {
            if (App.activeWindow == true)
            {
                //Run code
            }
            else
                continue;
        }
    }

因此,当我的页面加载时,方法启动,我使用bool变量,取决于生命周期状态,激活或停用。
这是一个好的代码和有效的吗?或者取消令牌是一个更好的方法?
先谢谢你了。

ryevplcw

ryevplcw1#

您可以使用App生命周期中的Stopped方法来实现。
此事件在窗口不再可见时引发。不能保证应用将从此状态恢复,因为它可能被操作系统终止。
在MVVM架构中使用,可以参考以下代码:
在App.cs中:

public partial class App : Application
{
      public App()
      {
            InitializeComponent();

            MainPage = new AppShell();
      }
      public static Window Window { get; private set; }
      protected override Window CreateWindow(IActivationState activationState)
      {
            Window window = base.CreateWindow(activationState);
            Window = window;
            return window;
      }
}

在视图模型中:

var window = App.Window;
      window.Stopped += (s, e) =>
      {
           Debug.WriteLine("------------>Stopped");
         //your code
      };

相关问题