最佳后台处理/API 调用方法?

Posted

技术标签:

【中文标题】最佳后台处理/API 调用方法?【英文标题】:Best background processing/API call approach? 【发布时间】:2016-07-21 18:55:21 【问题描述】:

我提出了两种不同的方法来处理主 UI 线程的 API 调用,我想知道哪一种在性能或资源分配方面更好。这些是特定于 android 的示例,但我也为 ios 设置了类似的设置,因此寻找具有跨平台考虑的答案。

选项 1 - 为请求启动一个新线程,并在 UI 线程的回调中处理响应:

    apiTestButton.Click += delegate
    
        progressBar1.Visibility = ViewStates.Visible;

        new Thread(new ThreadStart(() =>
        
            string response = Core.BLL.API.GetJsonTest();

            RunOnUiThread(() => ApiTestCallback(response));
        )).Start();
    ;

    void ApiTestCallback(string response)
    
        progressBar1.Visibility = ViewStates.Invisible;

        Toast.MakeText(this.ApplicationContext, "API response: " + response, ToastLength.Long)
             .Show();
    

选项 2 - 利用异步/等待:

    apiAsyncTestButton.Click += async (sender, e) =>
    
        progressBar1.Visibility = ViewStates.Visible;

        string response = Core.BLL.API.GetJsonTestAsync().Result;

        progressBar1.Visibility = ViewStates.Invisible;

        Toast.MakeText(this.ApplicationContext, "API response: " + response, ToastLength.Long)
             .Show();
    ;

使用 async/await,代码显然更简洁一些——不需要单独的回调方法。但我想知道这两个选项在性能方面是如何叠加的。我假设 Xamarin 会将 C# 转换/转换为平台原生逻辑(iOS 和 Android),但哪个更容易处理,是否存在性能影响?

【问题讨论】:

如果您使用的库提供了GetJsonTestAsync,请坚持使用async/await。不要使用额外的线程来包装对GetJsonTest 的调用。顺便说一句,此指南不是特定于 Xamarin 的。附带说明一下,有 Task.Run API,您几乎不需要使用低级线程 API。 【参考方案1】:

对于 iOS,答案是不同的。简短的回答是“使用 GCD”。 GCD (Grand Central Dispatch) 是一个简单的库,可以非常干净地管理并发任务。

GCD 代表您管理系统线程池。

Apple 强烈不鼓励您直接使用 pthread,因为它们是一种关键资源并且占用物理内存并且创建/销毁相当昂贵。

(我对 Xamarin 一无所知。我说的是原生 iOS 开发)

【讨论】:

以上是关于最佳后台处理/API 调用方法?的主要内容,如果未能解决你的问题,请参考以下文章

调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是啥?

处理来自前端的 API 调用的最佳方式

从 GCP HTTP 函数调用启动后台进程的最佳方法?

nodejs-在函数内执行多个异步调用的最佳方法?

在Angular 9中同步(即)按顺序进行N次api调用的最佳方法

缓存 GET 调用的 RESTful API 结果的最佳方法