使用 Async /Await 调用 Web API
Posted
技术标签:
【中文标题】使用 Async /Await 调用 Web API【英文标题】:Calling Web API with Async /Await 【发布时间】:2021-11-18 08:41:42 【问题描述】:我有一个使用 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 加载数据时切换而不会冻结
我正在使用后面的代码,我该如何处理?
【问题讨论】:
【参考方案1】:The .Wait()
method blocks the current thread until the task has completed。您应该将await
关键字与async
方法一起使用,这将释放您的程序以执行其他操作,直到异步任务完成,此时在使用await
的下一行继续执行。
来自https://docs.microsoft.com/en-gb/dotnet/api/system.threading.tasks.task.wait?view=net-5.0#System_Threading_Tasks_Task_Wait:
Wait 是一种同步方法,它使调用线程一直等到当前任务完成。 如果当前任务尚未开始执行,Wait 方法会尝试从调度程序中删除该任务,然后在当前线程上内联执行它。如果它不能这样做,或者当前任务已经开始执行,它会阻塞调用线程,直到任务完成。有关详细信息,请参阅 .NET 并行编程博客中的 Task.Wait 和“内联”。
将您的代码修改为:
...
var res = await client.GetAsync(grp);
...
【讨论】:
这解决了问题。谢谢 您还应该提到,Result
属性不应出于同样的原因使用以上是关于使用 Async /Await 调用 Web API的主要内容,如果未能解决你的问题,请参考以下文章
通过 ASP.NET Web API 有效地使用 async/await
在 web api 控制器(.net 核心)中使用 async/await 或任务