C# 从API同步获取数据

C# 从API同步获取数据,c#,windows-phone-8.1,C#,Windows Phone 8.1,我正在学习异步/同步概念 我已经实现了一个异步方法,从一个运行良好的API获取数据。但我也想学习同步调用API 我已经编写了以下代码,当我点击按钮获取数据时,它会挂起我的UI private void Button_Click_1(object sender, RoutedEventArgs e) { try { getData(); } catch (Exception ex) {

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

我已经实现了一个异步方法,从一个运行良好的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;
        }
    }
private void按钮\u单击\u 1(对象发送者,路由目标)
{
尝试
{
getData();
}
捕获(例外情况除外)
{
MessageBox.Show(“+ex”);
}
}
public void getData()
{
使用(HttpClient=new HttpClient())
{
HttpResponseMessage response=client.GetAsync(“http://api.androidhive.info/contacts/三、结果;
var data=response.Content.ReadAsStringAsync();
PersonList contactdata=JsonConvert.DeserializeObject(data.Result.ToString());
listcontact.ItemsSource=contactdata.contacts;
}
}
这意味着它是同步运行的(我想)。如果我错了,请改正

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

可能吗


提前感谢您的帮助。

您正在同步发出请求

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

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

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


任务实例将允许您获取有关正在运行的任务的信息(如果任务已完成、取消、出现故障),如果方法返回结果,则要获取该方法的返回值,您应将调用转换为使用异步版本:

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;
    }
}
private void按钮\u单击\u 1(对象发送者,路由目标)
{
尝试
{
运行(()=>getData());
}
捕获(例外情况除外)
{
MessageBox.Show(“+ex”);
}
}
公共异步任务getData()
{
使用(HttpClient=new HttpClient())
{
HttpResponseMessage response=await client.GetAsync(“http://api.androidhive.info/contacts/");
var data=await response.Content.ReadAsStringAsync();
PersonList contactdata=JsonConvert.DeserializeObject(data.Result.ToString());
listcontact.ItemsSource=contactdata.contacts;
}
}
像这样,对按钮单击的调用将是异步的,不应该阻塞UI线程,您可以刷新它以显示一些进度


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

使用此
response.Content.ReadAsStringAsync().Result
@shu op特别要求您不要发出synchrnus请求:)如果您想显示进度,请异步调用它并完成。使用只调用
.Result
的异步代码是毫无意义的,我想按照您的建议这样做,但是您如何详细说明如何实现一些进度条,直到结果出来generated@Vinita除非您有办法知道操作的高级程度,否则无法创建进度条。如果您这样做,您可以使用调度程序/事件来通知UI进度。如果您不知道,您将不得不使用不反映进度的动画(如用于windows 8+引导的动画)好的,谢谢,我只是想知道这是否可行。通过创建一个任务,代码的其余部分运行良好,非常感谢
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;
    }
}