C# 暂停主线程,直到触发事件

C# 暂停主线程,直到触发事件,c#,C#,我有一个小型控制台实用程序,它利用自定义解析库(我不可修改)来解析一些文件。解析器执行其工作时,会引发StatusChanged事件。在我的Main函数中,我为该事件附加了一个处理程序,以便在触发事件时执行一些任务 parser.StatusChanged += OnStatusChanged; 但是,我遇到了一个问题,因为Main线程没有等到事件触发后才退出。如何允许Main线程仅基于OnStatusChanged处理程序中的某些执行而终止?只要状态发生变化,就可以调用此处理程序,但我希望程

我有一个小型控制台实用程序,它利用自定义解析库(我不可修改)来解析一些文件。解析器执行其工作时,会引发
StatusChanged
事件。在我的
Main
函数中,我为该事件附加了一个处理程序,以便在触发事件时执行一些任务

parser.StatusChanged += OnStatusChanged;
但是,我遇到了一个问题,因为
Main
线程没有等到事件触发后才退出。如何允许
Main
线程仅基于
OnStatusChanged
处理程序中的某些执行而终止?只要状态发生变化,就可以调用此处理程序,但我希望程序仅在状态达到
Done
时退出

目前,我没有等待事件触发,而是在
Main
中有一个循环,循环(不执行任何操作),直到解析器达到
Done
的状态,但这似乎是错误的方法。此外,在释放模式下运行时,这个循环似乎不会因为某种原因而终止。它在调试模式下工作良好

while (parser.Status != ParserStatus.Done) { };

您的while循环并不遥远,您只需要添加一个等待,这样它就不会以尽可能快的速度旋转:

while (parser.Status != ParserStatus.Done) {
    Thread.Sleep(1000); // 1 second - adjust to an appropriate value ... 
}
您可能希望为此实现一个简单的超时,以避免它永远持续下去,这很容易:

Stopwatch sw = new Stopwatch();
sw.Start();

while (parser.Status != ParserStatus.Done || sw.ElapsedMilliseconds > A_TIMEOUT) {
    Thread.Sleep(1000); // 1 second 
}

我觉得很好。虽然(true)看起来很脏,但这确实是预期的功能。也不需要任何魔法中止处理,CTRL+C将隐式终止循环:)假定此库在工作线程上引发这些事件,请使用“调试>窗口>线程调试器”窗口进行验证。您需要一个AutoResetEvent来向主线程发送信号。将[StatThread]属性放在Main()方法上可能也会有影响。@HansPassant
AutoResetEvent
正是我想要的,谢谢!现在,在启动解析器之后,我等待
OnStatusChanged
处理程序在继续之前向事件发送信号。工作起来很有魅力!如果你想把这个作为答案,我可以接受。整整一秒钟!?:P@Davesoft嗯。。。一秒钟是相当长的时间/可以是。您的答案基本上就是我所评论的,只是措辞巧妙,并附有示例:)