停止页面导航返回的后台任务

本文关键字:返回 后台任务 导航 | 更新日期: 2023-09-27 18:05:51

我正在研制Xamarin。支持iOS和Android设备的Forms项目,我使用MVVM设计模式。

我有一个由ListView组成的导航根页面,当项目在这个ListView上被选中时,我执行以下命令来导航到项目详细信息视图。

Page DetailsPage = new View.DetailsView(SelectedItemData);
await Navigation.PushAsync(DetailsPage);

一旦这个详细信息页被打开,我开始运行一个后台任务。

private void StartBackgroundTask(){
    TimerBackgroundTask = new Timer((o) => {
         Device.BeginInvokeOnMainThread(() => Update()); }, null, 0, 1000);
    } 
}

基于这个类

public class Timer : CancellationTokenSource
{
    public bool IsDisposed { get; set; }
    public Timer(Action<object> callback, object state, int dueTime, int period)
    {
        System.Threading.Tasks.Task.Delay(dueTime, Token).ContinueWith(async (t, s) => 
        {
            Tuple<Action<object>, object> tuple = (Tuple<Action<object>, object>)s;
            while (!IsCancellationRequested)
            {
                await System.Threading.Tasks.Task.Run(() => tuple.Item1(tuple.Item2));
                await System.Threading.Tasks.Task.Delay(period);
            }
        },
        Tuple.Create(callback, state), CancellationToken.None,
        TaskContinuationOptions.ExecuteSynchronously | 
        TaskContinuationOptions.OnlyOnRanToCompletion,
        TaskScheduler.Default);
    }
    protected override void Dispose(bool disposing)
    {
        IsDisposed = true;
        if (disposing)
        {
            Cancel();
        }
        base.Dispose(disposing);
    }
}

Update函数每1秒更新一次UI。

一切正常,正如它应该的那样,这里没有问题,然而,一旦我导航回根页面,并返回到详细信息页面,问题就开始发生了——这样做两次会导致以下错误:

System.ArgumentException'jobject' must not be IntPtr.Zero. Parameter name: jobject

一旦StartBackgroundTask完全从代码中禁用,问题就会停止发生,所以我相信它是对错误负责的人。此外,我相当确信,这个后台任务继续运行在线程的某个地方,即使我导航回到根页面,我相信,如果我能以某种方式处置后台任务ondissaping事件/导航返回按钮按下,错误将不再持续。

不幸的是,我不知道如何我如何或即使它可能以某种方式绑定命令导航回按事件给我的视图绑定到ViewModel。

停止页面导航返回的后台任务

您可以通过重写onvanishing来检测页面正在被取消。在你的DetailPage中,你可以这样写:

    protected override void OnDisappearing()
    {
        TimerBackgroundTask?.Dispose();
        base.OnDisappearing();
    }