В обеих программах изменил открытие файла: добавил модификаторы доступа, убрал using. Уже около двух недель программа не вылетает. Вместо этого временами пишет в лог, что
Ошибка записи базы System.IO.IOException Процесс не может получить доступ к файлу "*.xml", так как этот файл используется другим процессом.
Что на работу программы не влияет. Поэтому можно считать, что баг устранен.
Вот как теперь выглядит код в первой программе, которая читает и пишет файл:
string fileName = Chart.GenerateDataBaseFileName(DateTime.Now);
//Прочитать данные из файла, записать в DataSet.
Stream readStream = null;
try
{
readStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
dataSet_base.ReadXml(readStream);
}
catch (Exception ex)
{
MainWindow.AddStringToLogFile("Ошибка чтения базы " + ex.GetType() + " " + ex.Message);
}
finally
{
readStream?.Dispose();
}
//Записать в DataSet текущие показатели датчиков.
try
{
dataSet_base.Tables[0].Rows.Add
(
DateTime.Now.ToString("t"),
KND_2.StateSensors.Tsens, KND_2.StateSensors.Psens
);
}
catch
{
MainWindow.AddStringToLogFile("Ошибка в сборе данных.");
}
//Записать полученные данные в файл.
Stream writeStream = null;
try
{
writeStream = File.Create(fileName);
dataSet_base.WriteXml(writeStream);
}
catch (Exception ex)
{
MainWindow.AddStringToLogFile("Ошибка записи базы " + ex.GetType() + " " + ex.Message);
}
finally
{
writeStream?.Dispose();
}
//Сохранить настройки окна (все чекбоксы, настройки, выборы.)
SaveDataSC(null, null);
А вот как во второй, которая только читает:
private bool ReadXmlFromStream(ref DataSet dataSetObj, string filePath)
{
//Очистить данные, оставшиеся с предыдущей записи.
dataSetObj.Clear();
//Прочитать данные из файла, записать в DataSet.
Stream stream = null;
try
{
stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Write | FileShare.ReadWrite | FileShare.Delete);
dataSetObj.ReadXml(stream);
}
catch(Exception ex)
{
stream?.Dispose();
Console.WriteLine("catch {0} {1} {2}", DateTime.Now.ToString("G"), ex.GetType(), ex.Message);
return false;
}
finally
{
stream?.Dispose();
}
return true;
}