我有一个控制台应用程序,我想在后台持续运行。我想如果我启动它然后告诉它等待事情会起作用。但是当我等待时,它会冻结应用程序。
这是我的代码:
课程计划 { static public ManualResetEvent StopMain;
static void Main(string[] args)
{
// Hide the cursor.
Cursor.Current = Cursors.Default;
StopMain = new ManualResetEvent(false);
RunHook runHook = new RunHook();
// wait until signalled by Program.StopMain.Set();
StopMain.WaitOne();
}
}
class RunHook
{
private HookKeys hook;
public RunHook()
{
hook = new HookKeys();
hook.HookEvent += EventForHook;
}
private void EventForHook(HookEventArgs e, KeyBoardInfo keyBoardInfo,
ref Boolean handled)
{
if ((keyBoardInfo.scanCode == 4) && (keyBoardInfo.vkCode == 114))
handled = true;
}
}
关于如何在后台运行但永不终止的任何想法?
答案 0 :(得分:2)
您看到的行为是预期的。你有一个线程,它处于等待状态。要获得某种形式的活动,您必须让调度程序实际执行某些操作。后台线程是实现此目的的一种方法:
static void Main(string[] args)
{
StopMain = new ManualResetEvent(false);
bool exit = false;
new Thread(
delegate
{
new RunHook();
while(!exit) { Thread.Sleep(1); }
}
).Start();
StopMain.WaitOne();
exit = true;
}
另一种方法是让主线程产生:
static void Main(string[] args)
{
StopMain = new ManualResetEvent(false);
RunHook runHook = new RunHook();
while(!StopMain.WaitOne())
{
Thread.Sleep(1);
}
}
当然也有其他方式。就个人而言,我不会做这些。相反,我会向RunHook类添加一个阻塞方法,并在完成或发出信号后返回它。