从 API 同步获取数据
Getting Data from API synchronously
我正在学习 async/sync 个概念。
我已经实现了从 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
任务实例将允许您获取有关 运行ning 任务的信息(如果它已完成、取消、出错),并且在方法 returning 结果的情况下,以获取方法
的return值
您应该将调用转换为使用异步版本:
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 对象。
我正在学习 async/sync 个概念。
我已经实现了从 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
任务实例将允许您获取有关 运行ning 任务的信息(如果它已完成、取消、出错),并且在方法 returning 结果的情况下,以获取方法
的return值您应该将调用转换为使用异步版本:
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 对象。