0

私は Windows 8 XAML/C# ストア アプリに取り組んでいます。アプリの有効期間中にXMLWindows.Storage.ApplicationData.Current.LocalFolderを複数回読み込もうとしています。XDocumentただし、System.UnauthorizedAccessExceptionファイルをロードしようとすると表示されます。ここに私の方法があります:

XML に追加するには:

private async void AddCategoryButton_Click(object sender, RoutedEventArgs e)
{
    XDocument CategoryListXDoc = await LoadXmlFromLocalFolderAsync("Categories.xml");
    CategoryListXDoc.Element("CategoryList").Add(
        new XElement("Category", new XAttribute("Id", Guid.NewGuid()), AddCategoryTextBox.Text));
    SaveXDocToLocalFolderAsync("Categories.xml", CategoryListXDoc);
}

デバッグ目的のためだけに:

private async void Button_Click_2(object sender, RoutedEventArgs e)
{
    XDocument TempXDoc = await LoadXmlFromLocalFolderAsync("Categories.xml");
    Debug.WriteLine(TempXDoc);
}

読み込みと保存の方法:

private async Task<XDocument> LoadXmlFromLocalFolderAsync(string FileName)
{
    var LocalFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    StorageFile CategoryListFile = await LocalFolder.GetFileAsync(FileName);
    var stream = await CategoryListFile.OpenStreamForReadAsync() as Stream;
    XDocument TempXDoc = XDocument.Load(stream);
    stream.Flush();
    return TempXDoc;            
}
private async void SaveXDocToLocalFolderAsync(string Filename, XDocument XDocToSave)
{
    var LocalFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    StorageFile CategoryListFile = await LocalFolder.CreateFileAsync(Filename, CreationCollisionOption.ReplaceExisting);
    var stream = await CategoryListFile.OpenStreamForWriteAsync() as Stream;
    XDocToSave.Save(stream);
    stream.Flush();
}

イベントを繰り返し発生させるClickと、例外がスローされます。特定のシナリオはありません。エラーが発生する場合と発生しない場合があります。どこが間違っていますか?私はかなり新しいasyncものawaitです。

4

1 に答える 1

1

本当に2つのスレッドがそのファイルにアクセスしようとしているかどうかを確認できます。例外のとを表示するMessageと役立つはずです。StackTraceのようなもの

  Message=Invalid cross-thread access.
 StackTrace:
   at MS.Internal.XcpImports.CheckThread()

そこに表示されるはずです。

この問題の解決策は、LoadXmlFromLocalFolderAsyncメソッドにロックを使用することです。これにより、2つのスレッドが同時にファイルを開くことができなくなります。 http://msdn.microsoft.com/en-us/library/a8544e2s(v=vs.100).aspx また、ファイルを常にtry-catch-finallyブロックで管理することをお勧めします。

しかし、これは少し汚れています。インタラクティブアプリケーションの問題は、ユーザーが狂ったようにボタンをすばやくクリックできないようにすることです。現在のボタン機能が終了するまで、ボタン機能を無効にする必要があります。ボタンをクリックすると、より複雑な操作が発生することを想像してみてください。これにより、使用するシステムリソースが不要になります。それは大丈夫ではありません。次のようなダブルクリックを防ぐ方法を使用するようにしてください:http: //tgynther.blogspot.ro/2011/07/aspnet-prevent-button-double-click.html

于 2012-10-24T11:50:59.717 に答える