C# 嵌套流调用中的System.UnauthorizedAccessException

C# 嵌套流调用中的System.UnauthorizedAccessException,c#,xml,ienumerable,xelement,C#,Xml,Ienumerable,Xelement,我在此函数中获得系统。未经授权的访问异常 public static async Task<IEnumerable<XElement>> XMLDisplaySignals() { StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile file = await storageFolder.GetFileAs

我在此函数中获得
系统。未经授权的访问异常

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;
            }
        }
我相信这是因为我处理xml的读写速度非常快。除了添加
睡眠
,这里还有其他解决方法吗?
XMLDisplaySignals
看起来像这样,处理和xml写入

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);
            }
        }

另外,如果我在for循环中增加300毫秒的睡眠时间,问题就解决了。然而,我们都知道睡眠并不是一个解决办法。

你说得对。睡眠不是解决办法,因为你永远无法确定手术需要多长时间

您需要在使用资源之前锁定它(即在
XMLDisplaySignals
方法中调用
OpenStreamForReadAsync
之前),以便在从上一次运行释放资源之前不会尝试该操作

说明如何使用
AsyncSemaphore
实现此目的

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);
            }
        }