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

时间:2010-08-02 17:40:04

标签: c# .net

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

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

static void SomeEventHandler()
{
    //Some logic
}

我想让我的应用程序表现得像Windows应用程序

Application.Run(new Form1());
调用

并运行消息循环。

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

3 个答案:

答案 0 :(得分:20)

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

一种非常有效的方法是等待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
}

答案 1 :(得分:2)

添加

附上事件处理程序后

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

答案 2 :(得分:-1)

编辑:遗憾的是,我不正确,这不起作用,因为没有为控制台应用程序定义Application(谢谢你,Reed Copsey)。

这应该可以解决问题,但是根据您选择的休眠时间,您最终可能会占用CPU。我觉得必须有更安全的方法吗?

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

<击>