使控制台应用程序的行为类似于Windows应用程序

我有一个控制台应用程序,我希望它等到某个事件被提出。 但它执行代码并退出:

static void Main(string[] args) { var someObjectInstance = new SomeObject(); someObjectInstance.SomeEvent += SomeEventHandler; } static void SomeEventHandler() { //Some logic } 

我想让我的应用程序像Windows应用程序一样

 Application.Run(new Form1()); 

被调用并运行消息循环。

但我既不需要消息循环也不需要任何forms。 所以它看起来像开销。 是否有更轻量级的方式来实现我的目标?

首先,除非SomeObject要在单独的线程上引发事件,否则如果没有在SomeObject进行某种forms的处理,这将无法工作。 但是,如果按照这种方式设计,这是相当简单的。

处理此问题的一种非常有效的方法是等待WaitHandle:

 private static ManualResetEvent waitHandle = new ManualResetEvent(false); static void Main(string[] args) { var someObjectInstance = new SomeObject(); someObjectInstance.SomeEvent += SomeEventHandler; waitHandle.WaitOne(); // Will block until event occurs } static void SomeEventHandler() { //some logic waitHandle.Set(); // Will allow Main() to continue, exiting the program } 

Console.ReadLine(); 附上事件处理程序后。

例如..

 class Program { static void Main(string[] args) { System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher(@"c:\", "*.txt"); watcher.Created += new System.IO.FileSystemEventHandler(watcher_Created); watcher.EnableRaisingEvents = true; Console.ReadLine(); } static void watcher_Created(object sender, System.IO.FileSystemEventArgs e) { Console.WriteLine(string.Format("{0} was created at {1:hh:mm:ss}", e.FullPath, DateTime.Now)); } } 

编辑:可悲的是,我是不正确的,这将无法正常工作,因为没有为控制台应用程序定义应用程序(谢谢你,Reed Copsey)。

这应该可以解决问题,尽管取决于您选择的hibernate时间,您最终可能会占用CPU。 我觉得必须有一个更安全的方法来做到这一点?

 while (true) { Application.DoEvents(); Thread.Sleep(this.SleepTime); }