c# - 使用 Async /Await 调用 Web API
问题描述
我有一个使用 Xamarin 社区工具包 TabView 使用的 Web API 端点。在选项卡选择更改时,我正在调用/发出获取请求。
请求:
public async void loadOtherData(string grp)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://xxxx.somee.com/api/GetTaskByStatus/");
var responseTask = client.GetAsync(grp);
responseTask.Wait();
var res = responseTask.Result;
if (res.IsSuccessStatusCode)
{
string readTask = await res.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<ObservableCollection<api>>(readTask);
Items1 = new ObservableCollection<api>(data);
AcceptList.ItemsSource = Items1;
}
}
}
此方法loadOtherData("")
从 API 获取数据,并将其绑定到列表。
我有一个 Tabview,当我更改选择选项卡时,我调用此方法:
private void AssignedTab_TabTapped(object sender, TabTappedEventArgs e)
{
await loadOtherData("Assigned");
}
private void PendingTab_TabTapped(object sender, TabTappedEventArgs e)
{
await loadOtherData("Pending");
}
我面临的挑战是,当我从一个选项卡切换到另一个选项卡时,该选项卡会冻结几秒钟,直到检索并绑定 API 数据。
我想要的是选项卡在从 Api 加载数据时切换而不会冻结
我正在使用后面的代码,我该如何处理?
解决方案
该.Wait()
方法阻塞当前线程,直到任务完成。您应该使用await
关键字 with async
methods 代替,它可以让您的程序执行其他操作,直到异步任务完成,此时执行将在使用后的下一行恢复await
。
Wait 是一种同步方法,它会导致调用线程等待当前任务完成。如果当前任务尚未开始执行,Wait 方法会尝试从调度程序中删除任务并在当前线程上内联执行它。如果它不能这样做,或者当前任务已经开始执行,它会阻塞调用线程,直到任务完成。有关详细信息,请参阅 .NET 并行编程博客中的 Task.Wait 和“内联”。
将您的代码修改为:
...
var res = await client.GetAsync(grp);
...
推荐阅读
- flutter - Flutter 多个 if 语句
- three.js - 为自定义 TubeGeometry 绘制盖子以使其看起来坚固
- java - 使用 Spring Data Elasticsearch 定义自定义日期格式和转换器
- django - cached_property 和 classmethod 不能一起工作,Django
- amazon-web-services - 使用哈希和范围键批量删除 dynamodb 表的项目
- javascript - Express 错误无法读取未定义的属性状态
- authentication - 如何使用 RxDB 处理 JWT 身份验证?
- r - 如何使用实际的 e 预测值计算 r 中的 MAPE?
- c++ - Android Studio:添加新的 .cpp/.h 文件时如何自动更新 CmakeLists.txt 文件
- python - 高损失验证