我有一个计时器功能,每分钟将一个对象序列化为一个xml文件。它工作了一段时间,但大约38个小时左右后,它有下面的IO异常。
我可以在屏幕截图中看到该目录。此问题发生时我甚至可以在dos中输入以下命令:echo“test”> test.xml和我可以在那个确切的目录位置创建test.xml文件。
我的代码如下:
try
{
if (!Directory.Exists(filePath))
this.log.Write(LogLevel.Fatal, this.componentName, "Directory not exists: " + filePath);
lock (lockObject)
{
filepath = filepath + "ApplicationState.xml";
if (File.Exists(filePath))
File.Delete(filePath);
if (this.StateObject != null && !File.Exists(filePath))
{
using (Stream sWrite = File.Create(filePath))
{
this.Serializer = new XmlSerializer(typeof(State));
this.Serializer.Serialize(sWrite, this.StateObject);
}
}
}
}catch (Exception ex)
{
if (this.log != null)
{
this.log.Write(ex, this.componentName);
}
}
finally
{
if (this.StreamWriter != null)
{
this.StreamWriter.Close();
}
bRun = true;
}
我最好尝试检查一下代码以确保没有任何挂起的IO资源,此时我真的很丢失诚实......窗口CE或C#是否有某种类型的锁定一般IO上的资源,而不是我用来打开和读取文件的资源?
答案 0 :(得分:4)
我看到你正在写一些名为“\ Hard Disk”的东西,这让我觉得你可能会写一些持久存储卷(例如板载闪存,USB磁盘,CF卡或其他)。请记住,这些外围设备需要设备驱动程序,并且可能需要一些中断处理程序,这些处理程序由设备OEM提供,而不是Microsoft作为操作系统的一部分提供。
总是有可能驱动链中存在导致问题的错误 - 它闻起来像并发锁失败。请记住,在使用嵌入式操作系统时,永远不要假设您看到的失败始终是您的代码。 OEM可能很容易在代码中出现错误。
我会攻击这两种方式: