我正在尝试实现一个持续运行的方法,只要应用程序的窗口处于活动状态,如果窗口最小化,则该方法应该停止。
我使用的是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变量,取决于生命周期状态,激活或停用。
这是一个好的代码和有效的吗?或者取消令牌是一个更好的方法?
先谢谢你了。
1条答案
按热度按时间ryevplcw1#
您可以使用App生命周期中的Stopped方法来实现。
此事件在窗口不再可见时引发。不能保证应用将从此状态恢复,因为它可能被操作系统终止。
在MVVM架构中使用,可以参考以下代码:
在App.cs中:
在视图模型中: