UWP-我无法从UI线程编辑Application类上的字段

问题描述

我的Files类中有一个类型为ObservableCollection<Element>属性Application

public sealed partial class App : Application
{
    public string CurrentPath;

    public ObservableCollection<Element> Files;

    public async void RefreshFilesAsync()
    {
        Files.Clear();

        var folder = await StorageFolder.GetFolderFromPathAsync(CurrentPath);
        var foldersRequest = folder.GetFoldersAsync();
        var filesRequest = folder.GetFilesAsync();

        var folders = await foldersRequest;
        var files = await filesRequest;

        foreach (StorageFolder directory in folders)
        {
            Files.Add(new FolderElement(directory));
        }

        foreach (StorageFile file in files)
        {
            Files.Add(new FileElement(file));
        }
    }

    // ...

}

ElementStorageFile对象的包装类。进行此类制作是为了在Name属性中设置新值,从而调用API重命名实际文件

public class Element
{
    public string Name
    {
        get => StorageFile.Name;
        set =>
        {
            StorageFolder.RenameAsync(value,NameCollisionoption.GenerateUniqueName).Completed = (IAsyncAction act,AsyncStatus status) =>
            {
                (App.Current as App).RefreshFilesAsync();
            };
        }
    }

    public StorageFile StorageFile { get; }

    //...

}

我有一个DataGrid链接到应用程序属性Files,因此可以推断出,每当我重命名文件名列时,都会调用API来执行真正的重命名。 >

这是我的问题发生的时间。 API调用成功,文件重命名,但是在RefreshFilesAsync()内,当调用Files.Clear();时,出现了一个异常The application called an interface that was marshalled for a different thread

我怎么了?

解决方法

要使用UI线程运行代码,我使用了Window.Current.Dispatcher.RunAsync(),并将其放在单独的异步方法中。该异常不再出现。

public string Name
{
    get => StorageFolder.Name;
    set => RenameAsync(value);
}

private async void RenameAsync(string newName)
{
    await StorageFolder.RenameAsync(newName,NameCollisionOption.GenerateUniqueName);
    await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => (App.Current as App).RefreshFilesAsync());
}