xamarin.ios - 在 Xamarin iOS 上使用 async/await 从后台获取创建后台安全任务

标签 xamarin.ios xamarin.forms async-await

我正在编写一个 Xamarin Forms 应用程序,当该应用程序处于后台时,我需要调用 REST 服务。我应该使用 async/await 还是会导致问题?

该场景是用户添加新项目,没有网络连接并关闭应用程序。我需要反复检查网络连接,当网络连接可用时,将新数据发布到 REST 服务。更糟糕的是,数据可能包含照片,因此可能需要几分钟的时间。

我尝试的解决方案涉及使用后台获取来检查网络连接,然后启动后台安全任务来完成繁重的工作。这是由于后台获取中运行的代码有 30 秒的限制。

这一切听起来不错,我的小测试应用程序似乎可以工作。我需要帮助的是如何最好地使用 async/await 来调用 REST 服务。

这里有一些代码显示测试应用程序正在做什么

public override async void PerformFetch(UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
    // kick off a long running task
    await StartLongRunningBackgroundTask();

    // this can be NoData, NewData or Failed
    completionHandler(UIBackgroundFetchResult.NoData);
}

public async Task StartLongRunningBackgroundTask()
{
    _backgroundTaskID = UIApplication.SharedApplication.BeginBackgroundTask(() => {
        // this is called if task times out
        if (_backgroundTaskID != 0)
        {
            UIApplication.SharedApplication.EndBackgroundTask(_backgroundTaskID);
            _backgroundTaskID = 0;
        }
    });

    try
    {
        var restService = FreshTinyIoCContainer.Current.Resolve<IRestClientService>();
        var result = await restService.GetDummyResult();

        var messagingService = FreshTinyIoCContainer.Current.Resolve<IMessagingService>();
        messagingService.Publish(new GotDataMessage { DataString = $"{result.foo} at {DateTime.Now:G}" });
    }

    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }

    UIApplication.SharedApplication.EndBackgroundTask(_backgroundTaskID);
}

我需要在 30 秒内从 PerformFetch 返回。我不确定await是否会这样做,或者我是否应该同步调用StartLongRunningBackgroundTask。

有什么想法吗?以前有人做过这种事吗?

顺便说一句,在 Android 上,我正在使用 Firebase 作业调度程序,一切运行良好。

最佳答案

调用 REST 服务应始终异步完成。但如果该调用的时间可能超过 30 秒限制,您应该考虑使用后台传输服务。您可以设置上传/下载以通过配置的 NSUrlSession 运行。 。要开始使用,请查看 walk through还有这个post 。您要做的基本上是从 PerformFetch 注册后台任务,iOS 将安排它运行。

关于xamarin.ios - 在 Xamarin iOS 上使用 async/await 从后台获取创建后台安全任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45728262/

相关文章:

C# 绑定(bind)库方法不接受实现参数

Xamarin Forms - 控制网格中按钮的高度

android-intent - BrainTree 上的 PayPal 集成(在 Xamarin.Forms 上)

ios - Xamarin Forms - TapGestureRecognizer 不适用于 iOS

c# - 如何在调用重方法之前使标签可见

c# - 使用顶级函数执行等待的嵌套异步调用

Javascript顺序打印到文件

ios - OpenGL ES 2.0/iOS : Skewed drawing of RGBA4 texture

c# - 在 iOS 中通过 VPS 访问远程数据

xamarin.ios - 如何为 Xamarin.iOS 创建 crashlytics 绑定(bind)?