问题描述
我的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));
}
}
// ...
}
Element
是StorageFile
对象的包装类。进行此类制作是为了在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());
}