使用 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 或任务

.NET Web应用中为什么要使用async/await异步编程

使用多个async / await调用构建对象

async 与 await 线程调用顺序

Js<async/await的使用>