System.ObjectDisposedException: 无法访问已释放的对象。 - 如何在 Xamarin 中检查 App 是否为 运行?

System.ObjectDisposedException: Cannot access a disposed object. - How to check if App is running in Xamarin?

我目前正在使用 Xamarin 结合 oxyplot 创建一个应用程序。我的情节在主应用程序页面上可见,每当我关闭我的应用程序时,它就会崩溃并显示以下消息:

Unhandled Exception:

System.ObjectDisposedException: Cannot access a disposed object. Object name: 'OxyPlot.Xamarin.Android.PlotView'.

请注意,这是 oxyplot-xamarin 包中的 known bug。现在,我正在尝试解决这个问题,但到目前为止没有成功。我的代码的关键部分如下所示:

private void OnTimerElapsed(object state)
{
    lock (Model.SyncRoot)
    {
        Update();
    }
    try {
        Device.BeginInvokeOnMainThread(() => Model.InvalidatePlot(true)); // this line crashes the app
    } catch {
    }
}

我想在这个定期调用的函数中询问该应用程序是否仍然存在或是否已经关闭。因此,解决方案必须看起来像这样:

private void OnTimerElapsed(object state)
{
    lock (Model.SyncRoot)
    {
        Update();
    }
    try {
        if (AppIsNotClosed)
        {
             Device.BeginInvokeOnMainThread(() => Model.InvalidatePlot(true)); // this line crashes the app
        }
    } catch {
    }
}

知道如何在 Xamarin 中检查应用程序的状态吗?非常感谢!

感谢@SushiHangover 的评论,我现在想出了下面给出的解决方案。我的 App.xaml.cs 现在看起来如下:

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyNamespace
{
    public partial class App : Application
    {
        private static bool AppIsActive = false;

        public App()
        {
            // InitializeComponent();
        }

        protected override void OnStart()
        {
            // Handle when your app starts
            AppIsActive = true;
        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
            AppIsActive = false;
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
            AppIsActive = true;
        }

        public static bool IsAppActive()
        {
            return AppIsActive;
        }
    }
}

那么,问题的方法可以重写如下:

private void OnTimerElapsed(object state)
{
    lock (Model.SyncRoot)
    {
        Update();
    }
    try {
        if (App.IsAppActive()) {
            Device.BeginInvokeOnMainThread(() => Model.InvalidatePlot(true));
        } else {
            timer.Dispose();
        }
    } catch {
    }
}