我们有一个令人困惑的案例,正常运行数百次的代码突然停止工作。这是一个通常运行数周的应用程序。
问题是,在XmlSerializer(Type)
某处是否有一些缓存,可能会损坏?
的背景:
它发生在启动时,有一次,我们遇到了很多例外。检测到问题后(几天后)重新启动后,它再次正常运行。
我们已经将问题追溯到此代码:
internal static class StateManager
{
private static XmlSerializer queueSerializer = new XmlSerializer(typeof(List<QueueItem>));
private static readonly string queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");
internal static void SaveQueue(List<QueueItem> upcomingTasks)
{
XmlWriter xmlWriter = XmlWriter.Create(queuePath, xmlSettings);
queueSerializer.Serialize(xmlWriter, upcomingTasks);
xmlWriter.Close();
}
internal static List<QueueItem> GetQueue()
{
var queue = new List<QueueItem>();
try
{
var xmlDoc = new XmlDocument();
xmlDoc.Load(queuePath);
using (XmlReader reader = XmlReader.Create(new StringReader(xmlDoc.OuterXml)))
{
queue = queueSerializer.Deserialize(reader) as List<QueueItem>;
}
}
catch (Exception e)
{
AppTrace.Write(TraceLevel.Error, string.Format("Failed to load State Queue: {0}", e.Message));
}
return queue;
}
}
我们得到的错误是:
Failed to load State Queue: The type initializer for 'StateManager' threw an exception.
据我们了解,这为罪魁祸首留下了两种可能性:
private static XmlSerializer queueSerializer = new XmlSerializer(typeof(List<QueueItem>));
或者
private static readonly string queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");
我们已经SubSystem.PersistentDirectory
仔细检查过,相信它是无辜的。
由于这发生在客户端机器的现场,我们无法重现它,因此无法检查内部异常。