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

Как я могу отключить это консольное приложение на основе событий?

Источник

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);
    }
}

Вопрос

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

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

4b9b3361

Ответ 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, если сможете.