0

我正在开发 Windows 8 XAML/C# 商店应用程序。我试图在应用程序的生命周期内多次加载Windows.Storage.ApplicationData.Current.LocalFolderXML XDocumentSystem.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

您可以检查是否真的有两个线程正在尝试访问该文件。查看异常的Message和应该会有所帮助。StackTrace

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

应该出现在那里。

解决这个问题的方法是对该LoadXmlFromLocalFolderAsync方法使用锁,这样两个线程就不能同时打开文件。 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 回答