如何让这个基于事件的控制台应用程序不立即终止?

时间:2011-12-30 04:10:49

标签: c# events filesystemwatcher

来源

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

问题

应该是非常自我解释的。我正在尝试创建一个文件监视器,以便我可以自动为我排序视频...如何让程序永不停止?

我想保持基于控制台的功能,所以我可以调试它,但最终我想删除控制台,让它在后台运行(我想作为服务)。

5 个答案:

答案 0 :(得分:22)

也许是这样的:

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

这样做可以让应用程序无限期地等待(或者等到时间坏了)才能更改文件。

答案 1 :(得分:7)

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

答案 2 :(得分:2)

你可以永远等待这个:

System.Threading.Thread.Sleep(-1);

答案 3 :(得分:2)

我遇到了与你完全相同的问题。我所做的是如果使用命令行--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
}

答案 4 :(得分:2)

由于这种情况,控制台应用程序绝不是测试事件的好方法。无论你使用什么方法,它都必须暂停当前线程,在某些while(true)循环中休眠或锁定,这会阻止你的事件被触发或者几乎不可能在事件中命中断点。 如果可以,请使用Windows应用程序。