обработать событие только один раз
никак не могу сделать, чтобы нужная функция запускалась только один раз. Вроде бы все очень просто. Придумал 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
{
// ...
}
}
}
}
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
{
// ...
}
}
}
}
Код:
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;
}
{
if (status)
{
status = false;
Console.WriteLine(e.ChangeType);
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
RestartService();
}
}
public static void RestartService()
{
// код рестарта
// ...
status = true;
}
Не могли бы показать итоговый пример. Я сделал так как вы предложили, однако все работает по старому.
Одному изменению в файловой системе, насколько помню, соответствует несколько событий. Вам нужно проверять поле e.ChangeType и выводить уведомление, только если оно имеет требуемое значение.