C# Xamarin iOS:启动计时器会使应用程序崩溃,无异常

C# Xamarin iOS:启动计时器会使应用程序崩溃,无异常,c#,ios,xamarin.forms,xamarin.ios,nstimer,C#,Ios,Xamarin.forms,Xamarin.ios,Nstimer,我正在开发一个Xamarin表单应用程序,我需要为它编写一些本机代码,我的代码在Android上运行,但我无法让它在iOS上运行。在Main.cs中,我使用NSTimer启动一个定时计时器,完成后,该计时器将启动Xamarin应用程序的AppDelegate代码 Main.cs: public class Application { private static ISettings AppSettings => CrossSettings.Current; private

我正在开发一个Xamarin表单应用程序,我需要为它编写一些本机代码,我的代码在Android上运行,但我无法让它在iOS上运行。在Main.cs中,我使用NSTimer启动一个定时计时器,完成后,该计时器将启动Xamarin应用程序的AppDelegate代码

Main.cs:

public class Application
{
    private static ISettings AppSettings => CrossSettings.Current;
    private static double startTimeMillis;

    static void Main(string[] args)
    {
        startTimeMillis = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;
        CheckSavedToken(args);
    }

    private static void CheckSavedToken(string[] args)
    {
        if (AppSettings.Contains(App.LoginToken))
        {
            string loginToken = AppSettings.GetValueOrDefault(App.LoginToken, string.Empty);
            if (loginToken == string.Empty)
            {
                AppSettings.Remove(App.LoginToken);
            }
        }
        double delay = 750 - (DateTime.Now.Ticks / TimeSpan.TicksPerSecond - startTimeMillis);
        if (delay > 0)
        {
            NSTimer.CreateScheduledTimer(delay, timer => UIApplication.Main(args, null, "AppDelegate"));
        }
        else
        {
            UIApplication.Main(args, null, "AppDelegate");
        }
    }
}
我想检查一个登录令牌,并在这个屏幕上停留,直到750毫秒过去,然后AppDelegate可以启动Xamarin表单应用的一部分

我不知道我做错了什么,我试着用try-catch进行调试,但是应用程序在没有达到catch的情况下崩溃了,我也试着使用
Task.Delay()
,但这也起到了同样的作用。即使我将时间量设置为1,仍然不会发生任何事情

编辑:

public class Application
{
    private static ISettings AppSettings => CrossSettings.Current;
    private static double startTimeMillis;

    static void Main(string[] args)
    {
        startTimeMillis = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;
        CheckSavedToken(args);
    }

    private static void CheckSavedToken(string[] args)
    {
        if (AppSettings.Contains(App.LoginToken))
        {
            string loginToken = AppSettings.GetValueOrDefault(App.LoginToken, string.Empty);
            if (loginToken == string.Empty)
            {
                AppSettings.Remove(App.LoginToken);
            }
        }
        double delay = 750 - (DateTime.Now.Ticks / TimeSpan.TicksPerSecond - startTimeMillis);
        if (delay > 0)
        {
            NSTimer.CreateScheduledTimer(delay, timer => UIApplication.Main(args, null, "AppDelegate"));
        }
        else
        {
            UIApplication.Main(args, null, "AppDelegate");
        }
    }
}
我还尝试使用DispatchQueue(结果相同):

我希望有人能帮我。
提前感谢。

原因:

public class Application
{
    private static ISettings AppSettings => CrossSettings.Current;
    private static double startTimeMillis;

    static void Main(string[] args)
    {
        startTimeMillis = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;
        CheckSavedToken(args);
    }

    private static void CheckSavedToken(string[] args)
    {
        if (AppSettings.Contains(App.LoginToken))
        {
            string loginToken = AppSettings.GetValueOrDefault(App.LoginToken, string.Empty);
            if (loginToken == string.Empty)
            {
                AppSettings.Remove(App.LoginToken);
            }
        }
        double delay = 750 - (DateTime.Now.Ticks / TimeSpan.TicksPerSecond - startTimeMillis);
        if (delay > 0)
        {
            NSTimer.CreateScheduledTimer(delay, timer => UIApplication.Main(args, null, "AppDelegate"));
        }
        else
        {
            UIApplication.Main(args, null, "AppDelegate");
        }
    }
}
主方法用于启动应用程序

UIApplication.Main(args, null, "AppDelegate")
我认为您的问题是因为您在尝试在此应用程序中执行某些操作时,甚至没有启动应用程序。因此,它会毫无例外地崩溃

解决方案:

public class Application
{
    private static ISettings AppSettings => CrossSettings.Current;
    private static double startTimeMillis;

    static void Main(string[] args)
    {
        startTimeMillis = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;
        CheckSavedToken(args);
    }

    private static void CheckSavedToken(string[] args)
    {
        if (AppSettings.Contains(App.LoginToken))
        {
            string loginToken = AppSettings.GetValueOrDefault(App.LoginToken, string.Empty);
            if (loginToken == string.Empty)
            {
                AppSettings.Remove(App.LoginToken);
            }
        }
        double delay = 750 - (DateTime.Now.Ticks / TimeSpan.TicksPerSecond - startTimeMillis);
        if (delay > 0)
        {
            NSTimer.CreateScheduledTimer(delay, timer => UIApplication.Main(args, null, "AppDelegate"));
        }
        else
        {
            UIApplication.Main(args, null, "AppDelegate");
        }
    }
}
在Main方法之后要延迟的地方添加延迟代码

您可以在iOS中添加到
FinishedLaunching
。AppDelegate.cs:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();


            startTimeMillis = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;

            double delay = 750 - (DateTime.Now.Ticks / TimeSpan.TicksPerSecond - startTimeMillis);
            if (delay > 0)
            {
                Task.Delay(5000).Wait();

                LoadApplication(new App());

                return base.FinishedLaunching(app, options);

            }
            else
            {
                LoadApplication(new App());
                return base.FinishedLaunching(app, options);

            }

        }

你为什么要推迟启动?我想让这个屏幕至少显示750毫秒,这样它就不会只是一系列的闪烁了