Nano Hash - криптовалюты, майнинг, программирование

Событие FileSystemWatcherChanged не срабатывает для файла с отображением памяти

У меня есть файл json, который я хочу разделить между двумя процессами. Поэтому я создал файл с отображением памяти следующим образом.

private void CreateMemoryMappedFile()
        {
            var info = Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "/" + model.Data.Settings.OrcaUISpecificSettings.TimeOutFolder);
            string path = Path.Combine(info.FullName + @"\" + model.Data.Settings.OrcaUISpecificSettings.File);
            FullPath = path;
            try
            {
                mmf = MemoryMappedFile.CreateFromFile(path, FileMode.CreateNew, "MyMemoryFile", 1024 * 1024);
            }
            catch (Exception ex)
            {

            }
        }

        public MemoryMappedViewStream GetAccessor()
        {
            MemoryMappedViewStream FileMapView = null;
            if (FileMapView != null)
            {
                return FileMapView;
            }
            FileMapView = mmf.CreateViewStream();
            return FileMapView;
        }

И для чтения и записи в файлы я делаю следующее

public void WriteToMemoryMappedFile(string Data)
        {
            try
            {
                mutex.WaitOne();
                byte[] bytes = Encoding.ASCII.GetBytes(Data);
                var accessor = GetAccessor();

                accessor.Write(bytes, 0, Data.Length);
                mutex.ReleaseMutex();
            }
            catch (Exception ex)
            {

            }
        }

public string ReadFromMemoryMappedFile()
        {
            mutex.WaitOne();
            var accessor = GetAccessor();
            using (BinaryReader binReader = new BinaryReader(accessor))
            {
                byte[] reader = binReader.ReadBytes((int)accessor.Length);
                string result = Encoding.Default.GetString(reader);
                mutex.ReleaseMutex();
                return result.Replace("NULL", "");
            }
        }

Моя проблема в том, что у меня есть монитор активности для моего приложения. Итак, через x раз я обновляю файл json с помощью InActiveStatus. В том же духе я прослушиваю любые изменения файла (посмотрите на событие D_IDle). Проблема в том, что если обычный файл изменен, я отлично получаю событие FileSytemWatcher изменено. Но когда я использую файл с отображением памяти для обновления статуса, событие изменения FileSystemWatcher никогда не запускается, пожалуйста, помогите.

private void D_IsIdle(object sender, EventArgs e)
        {
            MonitorDirectory();
            //AppViewModel.SerializeData("InActive");
            AppViewModel.SerializeDataToMemoryMap("InActive");
            d.IsIdle -= D_IsIdle;
        }
public void MonitorDirectory()
        {
            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(AppViewModel.GetDriectory());
            fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;
            fileSystemWatcher.Filter = "*.json";
            fileSystemWatcher.Changed += FileSystemWatcher_Changed;
            fileSystemWatcher.EnableRaisingEvents = true;
        }
private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
//IT NEVER COMES HERE
}

Ответы:


1

Использование FileSystemWatcher с отображаемыми в память файлами должно быть своего рода анти-шаблоном :). Если вы работаете в локальной системе, используйте один из примитивов синхронизации процессов (например, семафоры), чтобы сигнализировать об изменении.

Я предполагаю, что FileSystemWatcher срабатывает, когда дескриптор файла закрывается, чтобы избежать чтения частично записанных файлов другими процессами.

04.06.2018
  • Хм, это имеет смысл, я попробую использовать Semaphore, чтобы сигнализировать об изменении. 05.06.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..