2017-02-07 2 views
0

Ich erhalte System.UnauthorizedAccessException in dieser FunktionSystem.UnauthorizedAccessException in verschachtelten Strom ruft

public static async Task<IEnumerable<XElement>> XMLDisplaySignals() 
     { 
      StorageFolder storageFolder = ApplicationData.Current.LocalFolder; 
      StorageFile file = await storageFolder.GetFileAsync("sFile.xml"); 
      XDocument doc; 
      try 
      { 
       using (var stream = await file.OpenStreamForReadAsync()) 
       { 
        doc = XDocument.Load(stream); 
        IEnumerable<XElement> signals = doc.Descendants("signals"); 
        return signals; 
       } 
      } 
      catch(Exception ex) 
      { 
       Debug.WriteLine(ex.StackTrace); 
       return null; 
      } 
     } 

wenn sie in einer einer for Schleife 5-10 mal ohne Sleep genannt. Meine for-Schleife sieht wie folgt aus:

for (int j = 0; j < iItems[0].Count; j++) 
      { 
       IEnumerable<XElement> signals = await SampleDataSource.XMLDisplaySignals(); 
       if (signals != null && signals.Descendants("signal").Any()) 
       { 
        if(!signals.Descendants("signal").Any(x => x.Element("title").Value == iItems[0][j])) 
        { 
         Debug.WriteLine("Adding: " + iItems[0][j]); 
         await SampleDataSource.XMLAddXElement(new XElement("signal", new XElement("title", iItems[0][j]), new XElement("body", iItems[1][j]))); 
        } 
        else 
        { 
         Debug.WriteLine("Already in"); 
        } 
       } 
       else 
       { 
        //handle the bug hardcore 
        await SampleDataSource.XMLAddXElement(new XElement("signal", new XElement("title", iItems[0][j]), new XElement("body", iItems[1][j]))); 
       } 
     } 

Ich glaube, dies geschieht, weil ich xml schreibt am Umgang mit und liest sehr schnell. Gibt es einen Workaround neben dem Hinzufügen Sleeps? XMLDisplaySignals sieht wie folgt aus und Griffe und xml schreiben

public static async Task XMLAddXElement(XElement element) 
     { 
      StorageFolder storageFolder = ApplicationData.Current.LocalFolder; 
      StorageFile file = await storageFolder.GetFileAsync("sFile.xml"); 

      XDocument doc; 

      try 
      { 
       using (var stream = await file.OpenStreamForReadAsync()) 
       { 
        doc = XDocument.Load(stream); 
        var signals = doc.Descendants("signals").Single(); 
        signals.Add(element); 
        using (var stream2 = await file.OpenStreamForWriteAsync()) 
        { 
         stream2.SetLength(0); 
         doc.Save(stream2); 
        } 
       } 
      } 
      catch(Exception ex) 
      { 
       //Debug.WriteLine(ex.StackTrace); 
      } 
     } 

P. S. Wenn ich einen Schlaf von 300MS in der for-Schleife hinzufüge, ist das Problem gelöst. Wie wir jedoch alle wissen, ist Schlaf keine Lösung.

Antwort

0

Sie haben Recht. Schlaf ist keine Lösung, weil Sie nie sicher sein können, wie lange die Operation dauern wird.

Sie benötigen eine Ressource zu sperren, bevor Sie es (das heißt vor OpenStreamForReadAsync in Ihrem XMLDisplaySignals Methode aufrufen), so wird der Vorgang nicht versucht, bevor die Ressource aus dem vorherigen Lauf freigegeben wird.

This page erläutert, wie AsyncSemaphore für diesen Zweck verwendet wird.