Как я могу отключить это консольное приложение на основе событий?
Источник
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.Created+= fw_Created;
}
static void fw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
Вопрос
Должно быть довольно понятно. Я пытаюсь создать наблюдателя файлов, чтобы я мог автоматически сортировать свои видео для меня... как мне заставить программу не прерываться, когда-либо?
Я хочу сохранить консоль на данный момент, поэтому я могу ее отладить, но в конце концов я хочу удалить консоль и просто запустить ее в фоновом режиме (я думаю, как сервис).
Ответы
Ответ 1
Возможно, что-то вроде этого:
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.Changed += fw_Changed;
fw.EnableRaisingEvents = true;
new System.Threading.AutoResetEvent(false).WaitOne();
}
static void fw_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
Обновление
В духе оказания помощи кому-либо еще, кто может искать подобное решение, как указано в комментариях @Mark, существует также способ использования метода WaitForChanged
класса FileSystemWatcher
для решения этого вопроса:
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@".");
while (true)
{
Console.WriteLine("added file {0}",
fw.WaitForChanged(WatcherChangeTypes.All).Name);
}
}
}
Это позволяет приложению ждать бесконечно (или пока не будет нарушено) для файла, который нужно изменить.
Ответ 2
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.EnableRaisingEvents = true;
fw.Created += fw_Created;
Console.ReadLine();
}
static void fw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
Просто должен был EnableRaisingEvents
.
Нашел еще одно решение, которое, возможно, еще лучше:
class Program
{
static void Main(string[] args)
{
var fw = new FileSystemWatcher(@"M:\Videos\Unsorted");
fw.Created += fw_Created;
while(true) fw.WaitForChanged(WatcherChangeTypes.All);
}
static void fw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("added file {0}", e.Name);
}
}
Ответ 3
Вы можете ждать всегда, используя это:
System.Threading.Thread.Sleep(-1);
Ответ 4
У меня была такая же проблема, как и вы. То, что я сделал, - это если программа запускается с командной строкой --console
, она предложит вам нажать Enter, чтобы закрыть, если нет параметров, которые он будет ожидать в качестве службы.
class MyExampleApp : ServiceBase
{
public static void Main(string[] args)
{
if (args.Length == 1 && args[0].Equals("--console"))
{
new MyExampleApp().ConsoleRun();
}
else
{
ServiceBase.Run(new MyExampleApp());
}
}
private void ConsoleRun()
{
Console.WriteLine(string.Format("{0}::starting...", GetType().FullName));
OnStart(null);
Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName));
Console.ReadLine();
OnStop();
Console.WriteLine(string.Format("{0}::stopped", GetType().FullName));
}
//snip
}
Ответ 5
Консольные приложения никогда не являются хорошим способом тестирования событий из-за этого сценария. Независимо от того, какой метод вы используете, он должен остановить текущий поток, либо спящий, либо заблокированный в некоторый цикл while (true), который лишает ваши события обстрела или делает почти невозможным ударить точки останова внутри событий.
Используйте приложение Windows, если сможете.