You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin TabView切换时调用Async/Await Web API避免界面卡顿方案问询

核心问题根因
  • 代码中调用了responseTask.Wait()与responseTask.Result两个同步阻塞方法,会直接占用UI线程直到HTTP请求完成,是界面卡顿的核心诱因。
  • loadOtherData错误声明为async void,不符合普通异步方法的编写规范,异常处理难度更高。
  • 每次请求都新建HttpClient实例,会产生不必要的性能开销,长期运行还可能导致套接字资源耗尽。

优化后实现代码

首先修改数据加载方法:

// 全局复用HttpClient,避免频繁创建销毁的性能开销和套接字浪费
private static readonly HttpClient _httpClient = new HttpClient()
{
    BaseAddress = new Uri("https://xxxx.somee.com/api/GetTaskByStatus/")
};

// 普通异步方法返回Task,不要使用async void
public async Task LoadOtherData(string grp)
{
    try
    {
        // 直接await异步请求,不会阻塞UI线程
        var res = await _httpClient.GetAsync(grp);
        if (res.IsSuccessStatusCode)
        {
            string readTask = await res.Content.ReadAsStringAsync();
            var data = JsonConvert.DeserializeObject<ObservableCollection<api>>(readTask);
            Items1 = new ObservableCollection<api>(data);
            // 确保UI绑定操作在主线程调度,避免跨线程访问UI报错
            Device.BeginInvokeOnMainThread(() => 
            {
                AcceptList.ItemsSource = Items1;
            });
        }
    }
    catch (Exception ex)
    {
        // 此处可添加异常捕获逻辑,比如请求失败的提示弹窗
    }
}

再修改Tab点击事件逻辑,事件处理器可合法使用async void:

private async void AssignedTab_TabTapped(object sender, TabTappedEventArgs e)
{
    // 可选:切换Tab时先清空列表、展示加载占位符,提升用户感知
    AcceptList.ItemsSource = null;
    await LoadOtherData("Assigned");
}

private async void PendingTab_TabTapped(object sender, TabTappedEventArgs e)
{
    AcceptList.ItemsSource = null;
    await LoadOtherData("Pending");
}

额外优化建议
  • 可在加载数据期间展示加载动画占位,避免用户误以为界面无响应
  • 已加载过的Tab数据可做本地缓存,重复切换同个Tab时无需重复发起请求,进一步降低等待时间
  • 若列表项数量较多,可开启列表控件的UI虚拟化配置,减少数据绑定时的渲染开销

内容的提问来源于stack exchange,提问作者Anikwenwa Tosan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:54:03