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

时间:2018-08-06 22:16:10

标签: c# ios xamarin async-await

这里的基本设置是我具有独立于平台的代码,该代码进行REST调用,然后调用由平台特定的UI代码注册的事件处理程序,如果发生某些更改需要更新UI。这些事件处理程序必须在UI线程上执行。对于void调用来说,这一切看起来都非常简单,但是像这样的情况我不确定我是否做对了:

public override bool FinishedLaunching(UIApplication app,
                                       NSDictionary options) {
    /* Setup code removed */
    Task task = BackendService.DoSomethingAsync();
    return (true);
}

在iOS应用程序委托中。这是调用该异步任务并确保在运行时不阻止UI的正确方法吗?看来可行,但我不确定它是否会在线下随机炸毁。

2 个答案:

答案 0 :(得分:1)

您可以创建事件处理程序

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的一种情况。使用此模式还可以使您捕获调用异步函数可能引起的任何异常。

引用Async/Await - Best Practices in Asynchronous Programming

答案 1 :(得分:0)

如果您想使用“即发即弃”异步功能,请尝试以下方法;

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);
        }
    }

然后您可以通过以下方式使用它:

YourActionName().Forget();