代码之家  ›  专栏  ›  技术社区  ›  SiberianGuy

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

  •  10
  • SiberianGuy  · 技术社区  · 14 年前

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

    Application.Run(new Form1());
    

    调用并运行消息循环。

    3 回复  |  直到 7 年前
        1
  •  23
  •   Reed Copsey    14 年前

    首先,除非 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
    }
    
        2
  •  3
  •   Greg Bogumil    14 年前

    添加

    Console.ReadLine(); 在附加eventhandler之后。

    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));
        }
    }
    
        3
  •  -1
  •   Michael Paladino    11 年前

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

    这应该可以做到,尽管根据你选择的睡眠时间,你最终可能会占用CPU。我觉得一定有更安全的方法?

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