C# 有没有办法避免需要受保护的覆盖异步void OnStart()呢

C# 有没有办法避免需要受保护的覆盖异步void OnStart()呢,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我意识到OnStart()只是一个事件,所以我理解让它返回void没有问题。然而,我仍然收到一条令人讨厌的信息,给我一个警告 是否有其他方法允许我在OnStart()中运行异步方法 我是否可以创建一个任务并让它们(或当前在OnStart中的所有代码)在该任务中运行?或者我可以使用=构造忽略OnStart内部运行的任务的输出吗 更新: 根据尼科西的建议,以下是我的想法: 应用程序 助手 public static async Task PopulateMetrics() {

我意识到OnStart()只是一个事件,所以我理解让它返回void没有问题。然而,我仍然收到一条令人讨厌的信息,给我一个警告

是否有其他方法允许我在OnStart()中运行异步方法

我是否可以创建一个任务并让它们(或当前在OnStart中的所有代码)在该任务中运行?或者我可以使用=构造忽略OnStart内部运行的任务的输出吗

更新:

根据尼科西的建议,以下是我的想法:

应用程序

助手

    public static async Task PopulateMetrics()
    {
        await Task.Run(() =>
        {
            if (App.CPUSpeed == 0)
            {
                var stopWatch = Stopwatch.StartNew();
                stopWatch.Start();
                ArrayList al = new ArrayList(); for (int i = 0; i < 5000000; i++) al.Add("hello");
                App.CPUSpeed = 20000 / stopWatch.ElapsedMilliseconds;
            }
        });

    }

    public async Task ReviewAppAsync(int count)
    {
        try
        {
            async Task<bool> DelayAndDisplayAlert()
            {
                await Task.Delay(60000);
                return await MainPage.DisplayAlert("Review", $"\nWe noticed that you've used this application {count} times. We'd love to get some feedback for the application.\n\nCan you help us by rating the application or leaving a review?\n", "Yes", "No");
            }

            if (count == 0 || await DelayAndDisplayAlert())
            {
                if (Plugin.StoreReview.CrossStoreReview.IsSupported)
                {
                    if (Xamarin.Forms.Device.RuntimePlatform == "iOS")
                        Plugin.StoreReview.CrossStoreReview.Current.OpenStoreReviewPage("1477984412");
                    else if (Xamarin.Forms.Device.RuntimePlatform == "Android")
                        Plugin.StoreReview.CrossStoreReview.Current.OpenStoreReviewPage("com.ankiplus.Japanese");
                }
            }
        }
        catch (Exception ex)
        {
            Helper.RegisterCrash(ex,
                new Dictionary<string, string> {
                    {"ReviewAppAsync", "Exception" },
                    {"Device Model", DeviceInfo.Model },
                    {"Exception", ex.ToString()}
                });
        }
    }
公共静态异步任务PopulateMetrics() { 等待任务。运行(()=> { 如果(App.CPUSpeed==0) { var stopWatch=stopWatch.StartNew(); 秒表。开始(); ArrayList al=new ArrayList();for(int i=0;i<5000000;i++)al.Add(“hello”); App.CPUSpeed=20000/秒表.elapsedmill秒; } }); } 公共异步任务ReviewAppAsync(整数计数) { 尝试 { 异步任务延迟和显示警报() { 等待任务。延迟(60000); return wait MainPage.DisplayAlert(“Review”,$”\n我们注意到您已使用此应用程序{count}次。我们希望获得有关该应用程序的一些反馈。\n\n您可以通过对应用程序进行评级或留下评论来帮助我们吗?\n、“是”、“否”); } 如果(计数=0 | |等待延迟和显示警报()) { if(Plugin.StoreReview.CrossStoreReview.IsSupported) { if(Xamarin.Forms.Device.RuntimePlatform==“iOS”) Plugin.StoreReview.CrossStoreReview.Current.OpenStoreReviewPage(“1477984412”); else if(Xamarin.Forms.Device.RuntimePlatform==“Android”) Plugin.StoreReview.CrossStoreReview.Current.OpenStoreReviewPage(“com.ankiplus.Japanese”); } } } 捕获(例外情况除外) { 助手注册皮疹(例如, 新词典{ {“ReviewAppAsync”,“Exception”}, {“设备模型”,DeviceInfo.Model}, {“异常”,例如ToString()} }); } }
OnStart
实际上不是事件处理程序。这是对框架构建方式的误解。但是,您可以创建一个事件和异步处理程序,以允许异步代码按预期等待

private event EventHandler started = delegate { };

protected override void OnStart() {
    this.started += onStarted;      //Subscribe to event
    started(this, EventArgs.Empty); //Raise event
}

protected async void onStarted(object sender, EventArgs args) {
    try {

        //await custom code here

    } catch {
        //handle errors
    }
    //this.started -= onStarted; //Unsubscribe (OPTIONAL but advised)
}
异步事件处理程序是允许并可以正确处理
async void
的一个例外

async void
与重写的非事件处理程序
OnStart
一起使用,将导致遇到的任何异常都被吞没,因为非事件处理程序上的
async void
会触发并忘记


参考

@nikosi-谢谢,我会使用你建议的方法。只有一个问题,如果这里的//wait自定义代码包含诸如“wait MainPage.DisplayAlert”之类的语句,是否会有问题?@Alan2此时您仍在UI线程上,显示警报的行为将如预期的那样,@nikosi-谢谢。我有两种方法(如果它们因某种原因不起作用,这不是问题)。它们是:wait Helper.PopulateMetrics();等待Helper.LogStart();在我的新方法中,我可以将它们作为任务运行,还是使用类似于=Helper.PopulateMetrics()的东西运行它们;为了不让我的UI线程用于这些?@Alan2通过等待它们(如果异步),它们将是非阻塞的,因此不会影响/阻塞UIthread@Alan2没有看到计划中的问题。我建议等待助手按顺序运行。如果它们的调用互不依赖,则可以使用
Task.whalll
同时运行它们。
private event EventHandler started = delegate { };

protected override void OnStart() {
    this.started += onStarted;      //Subscribe to event
    started(this, EventArgs.Empty); //Raise event
}

protected async void onStarted(object sender, EventArgs args) {
    try {

        //await custom code here

    } catch {
        //handle errors
    }
    //this.started -= onStarted; //Unsubscribe (OPTIONAL but advised)
}