C /XAMLのWindows8アプリケーションの場合、LocalStateフォルダーにデータを保存する必要があります。async/await演算子を使用するのに問題があると思います。
アプリケーションの実行中にデータを保存しているときはすべて正常に機能しますが、OnSuspendingメソッドの実行中にデータを保存しようとすると、アプリケーションは保存メソッドの終了を待たずにアプリケーションを一時停止しているようです。
奇妙なことに、デバッグしてすべての操作を段階的に実行すると、すべてが正常に機能しますが、ブレークポイントを設定しないと、データが保存される前にアプリケーションが閉じられます。
これが私のコードです:
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
await api.BeforeClosing(true);
deferral.Complete();
}
public async Task BeforeClosing(Boolean toTombstoning)
{
SaveItem<LoadingProgress>(fileNameLoadingProgress, InitLoading);
}
public static async void SaveItem<T>(String fileName, T data, Boolean crossThreadSecure = false) where T : IBinarySerializable
{
await CreateNewStorageFile(fileName);
StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFolder dataFolder = await localFolder.GetFolderAsync("Data");
StorageFile file = await dataFolder.GetFileAsync(fileName);
using (var stream = await file.OpenStreamForWriteAsync())
{
using (var writer = new BinaryWriter(stream))
{
writer.Write<T>(data);
}
}
}
public async static Task CreateNewStorageFile(string filename)
{
StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFolder dataFolder = await localFolder.CreateFolderAsync("Data", CreationCollisionOption.OpenIfExists);
storage = await dataFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
}
awaitオペレーターに何か問題がありますか?または、アプリケーションを一時停止する前にいくつかの操作を実行できる最大時間はありますか?
ありがとうございました
編集:私はいくつかの新しいテストを行いました:deferral.Complete();を削除した場合。OnSuspendingメソッドから、データを適切に保存します(ただし、明らかにアプリを閉じることはありません...)。問題は、アプリケーションが一時停止しているときに時間がなくなることだと思います。このスレッドの問題のように見えます:App.OnSuspendingから呼び出されると、StorageFolder.CreateFileAsyncがクラッシュします。しかし、私はこの質問のすべての解決策を試しましたが、まだ問題があります...