Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2012, 14:19   #1
Suliman1
 
Регистрация: 18.03.2011
Сообщений: 3
По умолчанию Обработать событие только один раз

Ситуация очень простая. Мониторю изменение файла, через штатный 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
            {
                // ...
            }
        }





    }
}
Suliman1 вне форума Ответить с цитированием
Старый 03.09.2012, 15:25   #2
Гаврилов
Пользователь
 
Регистрация: 11.05.2012
Сообщений: 85
По умолчанию

Если ВСЕГДА событие происходит 3 раза, то самое простое, что приходит в башню: сделайте не Boolean переключатель, а Int или Byte счетчик и отсекайте с его помощью каждое 2-е и 3-е срабатывание, после чего переключайте его снова в 0.
Гаврилов вне форума Ответить с цитированием
Старый 03.09.2012, 15:45   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://msdn.microsoft.com/en-us/libr...hangetype.aspx
посмотрели бы на значение этого свойства, может там собака зарыта.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как запустить форму только один раз artemavd Общие вопросы Delphi 9 28.11.2010 16:43
Скрипт выполняется только один раз MAKSA JavaScript, Ajax 6 12.02.2010 13:48
Как выполнить действие только один раз? dolphin705 Общие вопросы Delphi 5 25.08.2009 09:33
timer срабатывает только один раз! KWN, lnc Общие вопросы Delphi 1 05.03.2009 12:58
Событие один раз Михаил Юрьевич Общие вопросы Delphi 4 01.04.2008 20:40