Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6305
Последний выпуск: 19.06.2015

обработать событие только один раз

81K
03 сентября 2012 года
Suliman1
8 / / 13.08.2012
Ситуация очень простая. Мониторю изменение файла, через штатный FileSystemWatcher. Происходит изменение файла - запускается функция растартующас сервис. Проблема в том, что оно походу генерирует несколько событий (не знаю каких) и у меня на консоль выводится все как будто файл менялся три раза.

никак не могу сделать, чтобы нужная функция запускалась только один раз. Вроде бы все очень просто. Придумал bool status = true, но он что-то не дает то что нужно.

Вот код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceProcess;
using System.Threading;


namespace ConsoleApplication1
{
    class FileMon
    {
        public static bool status;
   
        public static void Run()
        {
          try
            {

                FileSystemWatcher watcher = new FileSystemWatcher();
                watcher.Path = @"D:\test\";
                watcher.Filter = "*.txt";
                watcher.NotifyFilter = NotifyFilters.LastWrite;

                watcher.Changed += new FileSystemEventHandler(watcher_Changed);
                watcher.EnableRaisingEvents = true;

                Console.WriteLine(status);
                while (Console.Read() != 'q') ;

            }

            catch (Exception e)
            {
                Console.WriteLine(e);
            }

        }

        static void watcher_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine(e.ChangeType);
          //  status = true;
            Console.WriteLine(status);


            Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);

            if (status == true)
            {
                RestartService();
                status = false;
            }

            else
            {
           
            }

        }


        public static void RestartService()
        {


            ServiceController service = new ServiceController("6to4");
            try
            {
                int millisec1 = Environment.TickCount;

                TimeSpan timeout = TimeSpan.FromMilliseconds(50);
                Console.WriteLine("trying to stop");

                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

           //     Console.ReadKey();
                Console.WriteLine("stoping.........");

                // count the rest of the timeout
            //    int millisec2 = Environment.TickCount;
            //    timeout = TimeSpan.FromMilliseconds(50 - (millisec2 - millisec1));

                Console.WriteLine("dd");
              //  Console.ReadKey();
               
                service.Start();
                service.WaitForStatus(ServiceControllerStatus.Running, timeout);

                status = false;
            }
            catch
            {
                // ...
            }
        }





    }
}
[/code]
296
03 сентября 2012 года
koodeer
1.2K / / 02.05.2009
Полагаю, можно сделать как-то так:

Код:
static void watcher_Changed(object sender, FileSystemEventArgs e)
{
    if (status)
    {
        status = false;

        Console.WriteLine(e.ChangeType);
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);

        RestartService();
    }
}

public static void RestartService()
{
    // код рестарта
    // ...

    status = true;
}
81K
03 сентября 2012 года
Suliman1
8 / / 13.08.2012
Не могли бы показать итоговый пример. Я сделал так как вы предложили, однако все работает по старому.
278
03 сентября 2012 года
Alexander92
1.1K / / 04.08.2008
Одному изменению в файловой системе, насколько помню, соответствует несколько событий. Вам нужно проверять поле e.ChangeType и выводить уведомление, только если оно имеет требуемое значение.

Информация к размышлению: раз и два.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог