2
    public static async Task SaveFileAsync(string FileName, T data)
    {
        MemoryStream memStream = new MemoryStream();
        DataContractSerializer serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(memStream, data);

        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName,
            CreationCollisionOption.ReplaceExisting);
        using (Stream stream = await file.OpenStreamForWriteAsync())
        {
            memStream.Seek(0, SeekOrigin.Begin);
            await memStream.CopyToAsync(stream);
            await stream.FlushAsync();
        }
    }

    public static async Task<T> RestoreFileAsync(string FileName)
    {
        T result = default(T);
        try
        {
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(FileName);
            using (IInputStream inStream = await file.OpenSequentialReadAsync())
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                result = (T)serializer.ReadObject(inStream.AsStreamForRead());
                return result;
            }
        }

        catch (FileNotFoundException)
        {
            return default(T);
        }
    }

このコードを使用してデータを保存および取得していますが、正常に動作します。時々アプリを起動すると、突然すべてのデータが削除されますが、その理由は本当にわかりません。私はDataContractJsonSerializerそれを.txtファイルとして保存しようとしましたが、それでも同じ問題です。例外やエラーはありません。ファイル自体もチェックしました.xmlと.txtはすべてのコンテンツを削除します。私は実際に非常に混乱しています。

4

1 に答える 1

2

このような問題は通常、ロックの問題です。アプリを閉じて結果のファイルが空になると、ストリームが開いています。これは予想されます。競合状態を引き起こす複数の単体テストで非同期操作を使用する場合があります。これは予想されます。これは、スレッドをロックすることで解決できます。

この記事を読んで、それがあなたに役立つかどうかを確認してください:http: //blog.jerrynixon.com/2013/02/walkthrough-locking-asynchronous-file.html本当に役立つことを願っています。

于 2013-02-18T19:22:45.877 に答える