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

时间:2018-07-03 15:42:46

标签: c#

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

parser.StatusChanged += OnStatusChanged;

但是,我遇到了一个问题,因为Main线程不会等到事件触发后退出。如何仅基于Main处理程序中的某些执行来允许OnStatusChanged线程终止?每当状态更改时都可以调用此处理程序,但是我希望程序仅在状态达到Done时退出。

当前,我没有等待事件触发,而是在Main中进行了一个循环,该循环循环(不执行任何操作),直到解析器达到Done的状态为止,但这似乎是错误的方法。此外,当在“发布”模式下运行时,看起来此循环永远不会由于某种原因而终止。在调试模式下可以正常工作。

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

1 个答案:

答案 0 :(得分:0)

您的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 
}