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

21 浏览
0 Comments

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

我有一个控制台应用程序,并且我希望它等待某个事件被触发。但是它执行代码后就退出了:

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

我希望我的应用程序的行为像一个Windows应用程序,调用`Application.Run(new Form1())`并运行消息循环。

但是我既不需要消息循环,也不需要任何窗体。所以看起来有点多余。有没有更轻量级的方法来实现我的目标?

0
0 Comments

问题描述:如何使控制台应用程序表现得像Windows应用程序。

问题原因:控制台应用程序没有定义Application,因此无法使用Application.DoEvents()方法。此外,使用Thread.Sleep()会导致CPU占用率过高。

解决方法:使用Windows Forms应用程序,创建一个Windows Forms消息泵,然后在消息泵中使用Application.DoEvents()方法。这样可以使控制台应用程序表现得像Windows应用程序。

代码如下:

while (true)

{

Application.DoEvents();

Thread.Sleep(this.SleepTime);

}

0
0 Comments

问题的原因是想要将一个控制台应用程序的行为像一个Windows应用程序一样。解决方法是使用ManualResetEvent类的实例来等待事件的发生,并在事件处理程序中将事件设置为继续执行主方法,从而退出程序。下面是一个示例代码:

using System;
using System.Threading;
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
}

ManualResetEvent类是在System.Threading命名空间中定义的。更推荐使用ManualResetEventSlim类。

希望对您有所帮助,谢谢!

0
0 Comments

问题:如何使一个控制台应用程序的行为像一个Windows应用程序?

原因:在上述代码中,当设置了事件处理程序并启用了事件后,控制台应用程序会在调用Console.ReadLine();之后无限等待用户输入,除非有人在控制台中输入。这样的行为不适合这个例子,因为它与等待外部事件无关。

解决方法:在实际生产中,可以使用服务来处理这个特定的例子。但是上述代码也可以正常工作。

0