c# - 同步从 API 获取数据

标签 c# windows-phone-8.1

我正在学习异步/同步概念。

我已经实现了异步方法来从一个工作正常的 API 获取数据。但我也想了解同步调用 API。

我编写了以下代码,在我单击按钮获取数据时挂起我的 UI。

private void Button_Click_1(object sender, RoutedEventArgs e)
{
        try
        {
            getData();
        }
        catch (Exception ex)
        {
            MessageBox.Show(""+ex);
        }
    }

    public void getData()
    {
        using (HttpClient client = new HttpClient())
        {
            HttpResponseMessage response = client.GetAsync("http://api.androidhive.info/contacts/").Result;

            var data = response.Content.ReadAsStringAsync();

            PersonList contactdata = JsonConvert.DeserializeObject<PersonList>(data.Result.ToString());
            listcontact.ItemsSource = contactdata.contacts;
        }
    }

这意味着它正在同步运行(我想)。如果我错了,请指正。

我希望它应该显示一个进度环,直到它从 API 获取数据然后显示它。

这可能吗?

提前感谢您的帮助。

最佳答案

您正在同步发出请求。

这意味着发出请求的线程将停止,直到您获得结果。

问题是,由于您的 UI 正在启动请求,因此整个 UI 线程(正在刷新 UI)正在等待服务器的响应。

如果您想同步执行您的请求,而不暂停 UI 线程,您将必须使用 Task (或允许您在另一个线程上运行您的请求的任何其他对象)

var t = new Task(getData); //create the task, and tell it to run your method
t.Start(); //launch it

任务实例将允许您获取有关正在运行的任务的信息(如果它完成、取消、出错),并且在方法返回结果的情况下,获取方法的返回值

关于c# - 同步从 API 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35717284/

相关文章:

c# - Windows Phone 8.1 和 CurrentAppSimulator

multithreading - 在Windows Store App中生成线程会在UI线程中的任何定时等待调用中导致死锁

c# - MahApps MetroProgressBar 无法在 ControlTemplate 内工作

c# - 将 datetime2 数据类型转换为 smalldatetime 数据类型导致值超出范围。\r\n语句已终止

c# - 使用内部集合创建 where 谓词的动态查询

c# - 在 Sandbox 中使用 PayPal .NET SDK 验证 PayPal Webhook 调用

c# - 在 C# 中向 SQLite 数据库添加大量数据

Cordova Windows Phone 应用程序相机方向错误

unit-testing - 我可以通过 Visual Studio 2015 在 Windows Phone 8.1 设备上运行 'Unit Test App'

c# - Windows Phone 8.1 中的 ListView 在滚动长列表时摇摆不定 (XAML)