首页 > 解决方案 > 我试图在我的异步方法中运行一个任务,但它给了我一个 ui 线程错误

问题描述

这是我想做的事情:

    public async void CreateListSectionAsync()
    {
        details.Children.Clear();
        details.Children.Add(new MessageGridTemplate()
        {
            Label = "Information",
            Text = "Fetching card details, please be patient"
        });
        await Task.Run(() =>
        {
            // modify the UI
            details.Children.Clear();
        });

    }

但这会导致 UI 错误。我调用任务的方式不正确吗?

标签: xamarinxamarin.forms

解决方案


您不能从后台线程修改 UI 元素。

适当的缓解措施不是 Device.BeginInvokeOnMainThread。更正确的方法取决于您正在执行哪种 UI 更新:

  • 要显示后台线程操作的结果,请使用await.
  • 要显示后台线程操作的进度或多个结果,请使用Progress<T>/ IProgress<T>
  • 要在将事件推送到您的应用程序时显示更新,请使用SynchronizationContextIObservable<T>.ObserveOn

推荐阅读