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

如何让ACR UserDialogs的ShowLoading方法以异步Task运行?

解决ACR UserDialogs.ShowLoading异步运行卡顿的问题

我完全理解你的困扰——想让加载动画流畅运行,又不想去重写DoComplexStuff以及它调用的一堆关联方法。其实问题的核心不在ShowLoading本身,而是你之前的实现可能没把耗时操作真正放到后台线程,导致UI被阻塞,动画自然卡顿。不用动业务代码,咱们用简单的包装就能搞定:

核心原理

ShowLoading本身就是在UI线程执行的(毕竟要更新界面元素),卡顿的根源是耗时的同步方法DoComplexStuff占用了UI线程。我们只需要把这个耗时操作转移到后台线程,让UI线程保持响应,加载动画就能流畅动起来。

无需重写业务方法的解决方案

直接用Task.Run把DoComplexStuff包装成后台任务,配合await就能实现真正的异步执行,完全不用修改原业务方法:

// 在UI线程显示加载动画
UserDialogs.Instance.ShowLoading("正在处理,请稍候...");

try
{
    // 将耗时的同步方法委托给线程池执行,不阻塞UI
    await Task.Run(() => DoComplexStuff());
}
catch (Exception ex)
{
    // 处理可能出现的异常,比如弹出错误提示
    UserDialogs.Instance.Alert($"操作失败:{ex.Message}");
}
finally
{
    // 无论成功还是失败,确保加载动画被关闭
    UserDialogs.Instance.HideLoading();
}

为什么你之前的尝试会卡顿?

很大概率是你没有将DoComplexStuff从UI线程剥离:比如直接在UI线程同步调用它,或者错误地使用了不指定线程池的任务创建方式,导致UI线程被长时间占用,加载动画无法及时刷新,看起来就卡顿了。上面的写法用Task.Run会自动将任务分配到线程池,UI线程全程空闲,动画自然流畅。

额外提醒

  • 如果DoComplexStuff内部有更新UI的逻辑,记得用平台对应的主线程调度器(比如Xamarin的MainThread.BeginInvokeOnMainThread、MAUI的Dispatcher.Dispatch)将UI操作切回主线程,避免跨线程操作UI的错误。
  • 务必将HideLoading放在finally块中,防止出现异常后加载动画一直停留在界面上的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:22:25