从API同步获取数据

时间:2016-03-01 07:44:36

标签: 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获取数据然后显示它。

有可能吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您正在同步发出请求。

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

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

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

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

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

答案 1 :(得分:1)

您应该转换为使用异步版本的调用:

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

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

        var data = await response.Content.ReadAsStringAsync();

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

像这样,你对按钮点击的调用将是异步的,不应该阻止UI线程,你可以刷新它以显示一些进展。

如果同步运行,则会阻止UI线程。要在getdata函数中显示一些进度,可以使用事件或Dispatcher对象。