![](/img/trans.png)
[英]C# UWP - How do I fix the FileOpenPicker and StorageFile async error?
[英]How do I wait on async method in UWP for FileOpenPicker?
我想在UWP中创建一些简单的练习代码,该代码打开一个文本文件,然后立即在代码中附加一些琐碎的文本。
public MainPage()
{
this.InitializeComponent();
OpenFile();
SaveFile();
}
public async void OpenFile()
{
FileOpenPicker picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.Desktop;
picker.FileTypeFilter.Add(".txt");
DataFile = await picker.PickSingleFileAsync();
if (DataFile == null) { return; }
}
public async void SaveFile()
{
await FileIO.AppendTextAsync(DataFile, "" + DateTime.Now + "\n");
}
private StorageFile DataFile { get; set; }
如预期的那样,此代码返回错误,因为在SaveFile()方法中,因为SaveFile()在OpenFile()之后立即运行,并且因为OpenFile()尚未完成其获取要使用的File的目标文件的操作。 问题是,当我尝试在OpenFile中修改以下代码时,我收到一个AggregateException错误:
DataFile = picker.PickSingleFileAsync();
Task task = Task.Run( async() => DataFile = await picker.PickSingleFileAsync() );
task.Wait();
我想知道如何在SaveFile()运行之前阻止OpenFile()直到完成对目标文件的检索。
类的构造函数应该是快速的,并且绝对不应具有任何异步方法。 在您的情况下,您一直将这些方法作为fire-forget触发,这是一个竞争条件,您没有选择文件,而是尝试将其保存。 没有任何好处。
相反,如果您希望用户在创建MainPage之后就这样做,那么您可以为此使用Loaded事件:
public MainPage()
{
this.InitializeComponent();
this.Loaded += LoadedHandler;
}
private async void LoadedHandler(object sender, RoutedEventArgs e)
{
// assume that we want to do this only once
this.Loaded -= LoadedHandler;
await OpenFile();
await SaveFile();
}
public async Task OpenFile()
{
FileOpenPicker picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.Desktop;
picker.FileTypeFilter.Add(".txt");
DataFile = await picker.PickSingleFileAsync();
if (DataFile == null) { return; }
}
public async Task SaveFile()
{
await FileIO.AppendTextAsync(DataFile, "" + DateTime.Now + "\n");
}
private StorageFile DataFile { get; set; }
另请注意,我已将您的方法更改为“ 任务” -您应避免使用异步void 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.