Я обнаружил ошибку, вызвавшую это фиаско!
Причина этой проблемы не имеет ничего общего с XDocument.Load()
или .Save()
.Хотя я с облегчением решил мою проблему, мне также стыдно признать, что одна из моих собственных реализаций, которые я сделал несколько лет назад, вызвала это.
Однажды я создал класс-оболочку для System.Windows.Forms.OpenFileDialog()
, которыйоблегчит мою часто используемую конфигурацию класса OFD.В нем я использовал что-то вроде
var ofd = new OpenFileDialog();
try
{
if((var stream = ofd.OpenFile()) != null)
{
return ofd.FileName;
}
else
{
return "file already opened";
}
}
catch
{
return "error";
}
, сохраняя ссылки ofd
и stream
в качестве переменных экземпляра.Глядя на этот код, я теперь дрожу (или смеюсь), но тогда я не знал ничего лучшего.Конечно, это теперь укусило меня в моем ... потому что я не закрыл этот поток!Преступление, которое я совершил много лет назад, теперь стоило мне почти 2 дня работы.
Мое средство правовой защиты: я переписал свой класс-оболочку OFD для использования класса Microsoft.Win32.OpenFileDialog
, потому что у него, похоже, нет никакоговещи, основанные на потоках, которые могли бы непреднамеренно заблокировать файлы.
Извлеченные уроки (и то, что я настоятельно рекомендую другим): никогда не доверяйте себе при использовании потоков или других конструкций, которые можно оставить открытыми и вызвать утечки памяти.Прочитайте инструкцию using, которая использует шаблон dispose, вызвав метод IDisposable.Dispose()
, который обычно заботится о такой работе по очистке.И, наконец, используйте функции аккуратного профилирования в VS, которые не были доступны в то время, когда я делал свою оболочку OFD, они помогают обнаруживать такие проблемы.
Спасибо всем, кто помог, и SO, чтобы сделать их помощь доступной.