首页 > 解决方案 > 在另一个线程上运行后更新 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

根据文档,这对于桌面应用程序是正确的。如果它有所作为,我正在使用项目重聚

标签: c#

解决方案


我认为你应该能够做到这一点:

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);

推荐阅读