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