【问题标题】:What's the right way to keep my program from ending while waiting on events在等待事件时防止程序结束的正确方法是什么
【发布时间】:2012-06-22 22:53:10
【问题描述】:

我有一个应用程序设置了一些事件,需要等待这些事件发生后再退出。最好的方法是什么?我知道 Thread.Sleep 是一个糟糕的选择,原因有很多,包括它甚至无法在睡眠时处理事件。我显然不会用一个什么都不做的while循环来浪费cpu周期。那么,防止控制台应用程序在不确定的时间内退出以便它可以在引发事件时对其进行处理的最简单方法是什么?

最终这将成为一项服务,这将使它成为一个非问题,但现在在我的第一次迭代中,我只是在控制台应用程序中测试我的一些代码,然后我才遇到麻烦一个真正的服务(之前没有做过服务,所以我想确保我的代码是可靠的,以免使下一步复杂化)。在我写这篇文章时,我刚刚意识到我可以在 WinForms 应用程序中对其进行测试,这样就可以解决我的问题,呵呵。

【问题讨论】:

  • 您在谈论什么样的事件,什么样的应用程序?如果你能给我们更多的背景信息,那真的很有帮助。
  • 您是否在寻找类似于 MSDN 示例的 WaitHandle.WaitAll 的内容? msdn.microsoft.com/en-us/library/z6w25xa6.aspx
  • @JonSkeet 在上面放更多信息。我开始更全面地回答你的问题几次,但在不写一本书时遇到了麻烦。不过,我可能会在我吃完之后再试一次:)
  • 我在 this 的基础上编写了可以作为控制台应用程序运行和调试的服务。

标签: c# multithreading events


【解决方案1】:

我在 this 的基础上编写了可以作为控制台应用程序运行和调试的服务。

“让它更复杂”的方法对我也不起作用。

【讨论】:

    【解决方案2】:

    一个不错的选择是使用ManualResetEvent。这使您可以在等待设置事件时进行阻塞,而无需休眠。您的控制台应用程序的主例程可以在ManualResetEvent 上调用WaitOne(),这将阻塞。当您的例程完成后,只需调用 ManualResetEvent.Set() 即可关闭控制台应用程序。

    如果您需要等待一系列事件,CountdownEvent 是另一种选择。您可以拨打AddCount()和Signal根据需要增加和减少计数。

    【讨论】:

    • 我认为这是可以做到的,但我认为这不会让应用程序在阻塞时继续处理进一步的传入事件......至少在我的测试中没有出现刚刚。
    • @BrandonMoore 如果您正在处理其他线程,它应该可以正常工作。这将阻塞主线程,其他线程应处理设置您的事件。
    • 其实主线程只是调度新线程来处理传入的事件。那么在 WinForms 应用程序的主 GUI 线程上执行此操作会使其无法处理控制事件(如按钮单击事件)吗?到目前为止,我的测试似乎对我来说是这样,但也许我的代码中还有其他问题,因为我编写的代码比我通常在没有增量测试的情况下编写的要多得多。
    • 也就是说,我用一个 WinForms 应用程序的类比说,如果它在那里不起作用,那么它也不适用于我正在做的事情,而且它似乎并不就像我目前所知的那样。
    • @BrandonMoore 控制台应用程序没有消息泵,因此您需要阻止它以防止其关闭。在 WinForms 应用程序中,窗口本身会阻止它关闭消息泵。我们需要更多详细信息,让您了解如何让它为您服务。
    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2013-03-24
    • 2013-01-09
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多