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

时间:2016-04-01 20:25:08

标签: c# android ios xamarin async-await

我已经提出了两种不同的方法来处理主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 - 利用async / await:

    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),但是它更容易处理并且是否存在性能影响?

1 个答案:

答案 0 :(得分:0)

iOS的答案有所不同。简短的回答是"使用GCD。" GCD(Grand Central Dispatch)是一个简单的库,可以非常清晰地管理并发任务。

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

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

(我不知道关于Xamarin的任何事情。我正在谈论本机iOS开发)