Je voulais créer un code de pratique simple dans UWP qui ouvre un fichier texte, puis ajoute immédiatement ce code avec du texte trivial.Comment j'attends la méthode async dans UWP pour FileOpenPicker?
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; }
Comme prévu, ce code renvoie une erreur car la méthode SaveFile(), puisque SaveFile() fonctionne immédiatement après OpenFile() et depuis OpenFile() n'a pas terminé son opération de récupération du fichier cible pour SaveFile () utiliser. La chose est, lorsque je tente de modifier le code suivant dans OpenFile, je reçois une erreur AggregateException:
DataFile = picker.PickSingleFileAsync();
Task task = Task.Run(async() => DataFile = await picker.PickSingleFileAsync());
task.Wait();
Je me demandais comment je peux bloquer OpenFile() jusqu'à ce qu'il soit fait récupérer le fichier cible, avant SaveFile () fonctionne.
Cela peut être résolu par les réponses à cette question: https://stackoverflow.com/questions/32084943/async-lock-not-allowed – Laith
async compose mal, c'est tortues tout le chemin et le problème de base ici est la tortue finale, le constructeur ne peut pas être asynchrone. Vous avez juste besoin de faire cela en sens inverse, * d'abord * demander un nom de fichier, * puis * créer l'objet de classe. Que son nom est MainPage n'est pas génial, ne jamais demander l'entrée de l'utilisateur immédiatement au démarrage du programme avant de montrer une interface utilisateur. Les dialogues ont besoin d'une fenêtre pour rester dessus. Sinon, la raison pour laquelle les programmes ont généralement une commande Fichier> Ouvrir. –