UWPでテキストファイルを開き、すぐにそのコードに簡単なテキストを追加する簡単な練習コードを作成したかったのです。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; }
期待セーブファイル()は直ちにのOpenFile(後に実行されるため、このコードは、セーブファイル()メソッドであるためエラーを返したように)とのOpenFileので()は(SAVEFILEためのターゲット・ファイルを検索する動作を完了していません)を使用します。事は、私がのOpenFileに次のコードを変更しようとすると、私はAggregateExceptionエラーを受け取り、次のとおりです。
DataFile = picker.PickSingleFileAsync();
Task task = Task.Run(async() => DataFile = await picker.PickSingleFileAsync());
task.Wait();
私はそれはセーブファイルの前に、対象のファイルを取得完了するまで、私は(のOpenFile()をブロックすることができますどのように思っていた
)が実行されます。
これは、この質問の答えによって解決できます:https://stackoverflow.com/questions/32084943/async-lock-not-allowed – Laith
非同期で構成されている、それはすべての方法をダウンカラスとここでのコアの問題ですそれは最後のカメであり、コンストラクタは非同期ではありません。これを逆にする必要があります。*最初にファイル名を要求し、*次に*クラスオブジェクトを作成します。その名前がMainPageであることは素晴らしいことではありません。UIを表示する前に、プログラムの開始時にすぐにユーザーの入力を求めないでください。ダイアログはウィンドウの上部に留まる必要があります。そうでなければ、プログラムには一般にファイル>開くコマンドがあるのです。 –