UIが「すばやく」使用されている場合にのみ、XmlException「予期しないファイルの終わり」を発生させるDataContractSerializerを使用したWindows 8キャッシングソリューションが機能しています。
public static class CachingData<T>
{
public static async void Save(T data, string filename, StorageFolder folder = null)
{
folder = folder ?? ApplicationData.Current.LocalFolder;
try
{
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
using (IRandomAccessStream raStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
using (IOutputStream outStream = raStream.GetOutputStreamAt(0))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(outStream.AsStreamForWrite(), data);
await outStream.FlushAsync();
}
}
}
catch (Exception exc)
{
throw exc;
}
}
public static async System.Threading.Tasks.Task<T> Load(string filename, StorageFolder folder = null)
{
folder = folder ?? ApplicationData.Current.LocalFolder;
T data = default(T);
StorageFile file = await folder.GetFileAsync(filename);
using (IInputStream inStream = await file.OpenSequentialReadAsync())
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
data = (T)serializer.ReadObject(inStream.AsStreamForRead());
}
return data;
}
}
たとえば、ユーザーがリスト内のアイテムをクリックすると、CachingData.Load は await を介して async と呼ばれ、FileNotEoundException をチェックし、ディスクまたはネットワークからデータをロードし、完了時にシリアル化します。最初にロードされた後、ユーザーはリスト内の別のアイテムを選択し、サイクルが繰り返されます。
この問題は、「最初のロード後」が「ロードを待機しない」になり、選択したアイテムがキャッシュされていない場合に発生します。
無視するだけでアプリを続行できることを期待して、続行する方法やデバッグする方法さえよくわかりません(キャッシュの速度が向上するだけで)