首页 > 解决方案 > 使用 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 加载数据时切换而不会冻结

我正在使用后面的代码,我该如何处理?

标签: c#asp.net-coreasp.net-web-apixamarin.formsxamarin.android

解决方案


.Wait()方法阻塞当前线程,直到任务完成。您应该使用await关键字 with asyncmethods 代替,它可以让您的程序执行其他操作,直到异步任务完成,此时执行将在使用后的下一行恢复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);
        ...

推荐阅读