xamarin - 我试图在我的异步方法中运行一个任务,但它给了我一个 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 错误。我调用任务的方式不正确吗?
解决方案
您不能从后台线程修改 UI 元素。
适当的缓解措施不是 Device.BeginInvokeOnMainThread
。更正确的方法取决于您正在执行哪种 UI 更新:
- 要显示后台线程操作的结果,请使用
await
. - 要显示后台线程操作的进度或多个结果,请使用
Progress<T>
/IProgress<T>
。 - 要在将事件推送到您的应用程序时显示更新,请使用
SynchronizationContext
或IObservable<T>.ObserveOn
。
推荐阅读
- sql-server - 带有 AG 侦听器的 SSRS 中的数据源连接字符串
- angular - 在 nativescript(typescript + angular)中不使用 formdata 发布图像和其他信息
- ansible - Ansible Playbook 中的 Debug 语句与 Ansible Role 中的行为不同
- android - 特权系统应用程序的权限处理
- materialize - 日期选择器提交格式
- clearcase - 如何在 clearcase 中签出文件的特定版本?
- javascript - 如何根据所选选项设置下拉按钮文本?
- python - Cloud Firestore 更新方法在几次更新后崩溃
- asp.net-core-webapi - 在值对象表中插入数据
- c# - 当我连续运行多重测试时,NSubstitue Received() 不起作用,但如果我单独运行测试,它们会起作用