Задать вопрос
  • Почему программа на С# при параллельном чтении одного и того же файла другой программой тихо завершается?

    @fill_n Автор вопроса
    В обеих программах изменил открытие файла: добавил модификаторы доступа, убрал 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;
            }
    Ответ написан
    Комментировать