我正在编写一个 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/