C# Xamarin从返回值的重写调用异步函数

C# Xamarin从返回值的重写调用异步函数,c#,ios,xamarin,async-await,C#,Ios,Xamarin,Async Await,这里的基本设置是,我有独立于平台的代码,可以进行REST调用,然后在需要更新UI的情况下,调用由特定于平台的UI代码注册的事件处理程序。这些事件处理程序必须在UI线程上执行。对于void调用,这一切似乎都非常简单,但在这种情况下,我不确定我是否做对了: public override bool FinishedLaunching(UIApplication app, NSDictionary options) {

这里的基本设置是,我有独立于平台的代码,可以进行REST调用,然后在需要更新UI的情况下,调用由特定于平台的UI代码注册的事件处理程序。这些事件处理程序必须在UI线程上执行。对于void调用,这一切似乎都非常简单,但在这种情况下,我不确定我是否做对了:

public override bool FinishedLaunching(UIApplication app,
                                       NSDictionary options) {
    /* Setup code removed */
    Task task = BackendService.DoSomethingAsync();
    return (true);
}
这在iOS应用程序委托中。这是调用异步任务并确保在UI运行时不挂起它的正确方法吗?它似乎可以工作,但我不确定它是否会在线路上随机爆炸。

如果你想要一个“点火并忘记”异步功能,试试这个

public static class TaskExtensions
    {
        /// <summary>       
        /// It is used when you want to call an async method without
        /// awaiting for it. Using this method suppresses the warning CS4014.
        /// </summary>
        /// <param name="task">Task to be called using a fire-and-forget call</param>
        public static void Forget(this Task task)
        {
            task.ConfigureAwait(false);
        }
    }

您可以创建一个事件处理程序

private event EventHandler LaunchFinished = delegate { };
然后在
FinishedLaunching
方法中订阅并引发事件

public override bool FinishedLaunching(UIApplication app, NSDictionary options) {
    // subscribe to event with event handler
    LaunchFinished += LaunchFinishedHandler;
    // raise event
    LaunchFinished(this, EventArgs.Empty);        
    return (true);
}
可以等待事件处理程序,以便它不会阻止UI线程

private async void LaunchFinishedHandler(object sender, EventArgs args) {
    LaunchFinished -= LaunchFinishedHandler; //optional

    // Setup code removed for brevity

    //On UI Thread

    await BackendService.DoSomethingAsync(); //non blocking await

    //Back on UI thread
}
事件处理程序是允许
async void
的一种情况。使用此模式还可以捕获调用异步函数时可能出现的任何异常


参考资料

您是否调用
FinishedLaunching
?该代码将启动
async
操作,并在您不知道结果的情况下立即返回。当应用程序启动时,操作系统将调用FinishedLaunching。我只需要启动查询web服务的调用。我只是不确定在没有等待任务的情况下会发生什么。它会调用您的Web服务并返回。如果您不关心调用是否成功,则可以将代码保留在其中;如果您关心结果,则必须同步调用您的Web服务或在其他地方执行。需要使用什么方法读取FinishedLaunching返回的值?如何解释布尔值?
private async void LaunchFinishedHandler(object sender, EventArgs args) {
    LaunchFinished -= LaunchFinishedHandler; //optional

    // Setup code removed for brevity

    //On UI Thread

    await BackendService.DoSomethingAsync(); //non blocking await

    //Back on UI thread
}