【发布时间】:2021-06-27 13:00:33
【问题描述】:
我很确定这有一个相对简单的答案,但不知何故我找不到它。
在处理事件的控制台应用程序示例中(例如https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html,但我也见过很多其他的)我看到这样的代码:
public static void Main()
{
var someObject = new MyClassWithEvents();
someObject.SomeEventFired += () =>
{
// do whatever
};
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
现在明显的问题是,如果您超出示例代码(您可以在其中等待按键被按下)并删除 Console.ReadLine() 线程退出(或者如果您不在 Main() 中,您脱离上下文)并且不再处理事件。
我想我可以使用一个永恒的while(true) { Sleep() },但这不会也阻止线程接收事件吗?
编写这种程序的正确方法是什么?这个想法是它看起来很像一个服务,等待在那里什么都不做,直到一个事件被触发。
要了解我的意思,请尝试以下代码:
public static void Main()
{
var someObject = new MyClassWithEvents();
someObject.SomeEventFired += () =>
{
// do whatever
};
}
这立即存在!
TIA,
吉姆
【问题讨论】:
-
旋转等待是您最不想要的。但是让我们假设您找到了一种在没有
Console.ReadLine()的情况下“永远等待”的方法。你的程序应该如何终止?绝不?那么服务可能正是您真正想要的? -
那么这可能是你感兴趣的:ManualResetEventSlim
-
对@RandRandom,谢谢,就是这个意思,这不会立即退出吗?如果第一个事件在几分钟后发生怎么办?
-
正确的家伙,确切地说,我这些天的具体例子是 rabbitmq 队列,但 FileSystemWatcher 也是一个很好的例子。
-
是的,那当然是另一回事了。 @Fildor 的水晶球比我的更准确。 :)
标签: c# multithreading events