c# - 在另一个线程上运行后更新 UI
问题描述
我有以下代码从运行异步的谷歌表中获取一些信息:
private async void getCodes()
{
ArrayList codes = await Task.Run(() =>
{
return GoogleAPI.GetDates();
});
foreach (DateTime date in codes)
{
Debug.WriteLine("**************");
Debug.WriteLine(date);
codesList.Items.Add("Test");
}
}
该codesList.Items.Add("Test");
行使应用程序崩溃,因为它试图在后台线程而不是主线程上运行 foreach。写线工作正常。
'应用程序调用了一个为不同线程编组的接口。
研究表明我应该能够使用:
await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
在主线程上运行它,但这会崩溃:
System.NullReferenceException:'对象引用未设置为对象的实例。'Microsoft.UI.Xaml.Window.Current.get 返回 null
根据文档,这对于桌面应用程序是正确的。如果它有所作为,我正在使用项目重聚
解决方案
我认为你应该能够做到这一点:
await codesList.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
foreach (DateTime date in codes)
{
Debug.WriteLine("**************");
Debug.WriteLine(date);
codesList.Items.Add("Test");
}
});
另一个建议可能是将您的代码编辑为:
codes = await Task.Run(() =>
{
return GoogleAPI.GetDates();
}).ConfigureAwait(true);
推荐阅读
- python - 查找匹配姓氏的正则表达式模式
- python - Pythonic 方法来移动 dict 中的所有键
- azure - 在 Visual Studio 中本地(调试时)使用 Azure 发布管道变量
- javascript - 为什么 Array(x).map 没有返回正确的对象?
- string - 如何在 MIPS 中修改和打印字符串?
- c# - 由于我的restapi客户端返回旧数据,如何清除缓存?
- jakarta-ee - 当 RuntimeException 在另一个 bean 中抛出时,JTA 不回滚事务?
- swift - Multiline UILabel:使用 boundingRect() 为标签的特定部分添加自定义下划线
- google-chrome-extension - 一次性开发者注册费问题
- javascript - 是否可以在导出的模块中使用 Vuex mapActions