【问题标题】:Pause a Method/Prevent Balloon Tip from Displaying More Than Once暂停方法/防止气球提示显示不止一次
【发布时间】:2013-11-25 06:04:41
【问题描述】:

这是我的情况,我正在尝试创建一个系统,当网络出现故障时,会出现一个气球提示告诉我它已出现故障。但是,通过将气球提示代码放置在监控网络的事件中(每个滴答声都使用计时器,所以基本上是一个 while 循环),气球提示会在每个滴答声中出现,而我只希望它出现一次。

我还尝试使用两个单独的计时器,让第一个计时器启动另一个计时器,当网络出现故障时,气球提示会显示,然后计时器停止。然后我意识到“Thread.Sleep”会停止整个程序,因为代码在一个线程下运行。

是否有停止计时器 X 秒或仅暂停一种方法 X 秒以使气球提示只显示一次?

对不起,我的解释太啰嗦了。

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 只保留一个布尔变量,将其命名为 NetworkIsDown。仅当您将气球从 false 更改为 true 时才显示。

标签: c# multithreading timer


【解决方案1】:

所以有几件事...

当您进行轮询时(例如在您的 while 循环中),最好使用与您的程序正在执行的线程不同的线程。否则,它会锁定您应用的 UI。

我会在另一个线程上运行轮询网络连接的方法。完成此操作后,跟踪变量中的任何最后网络状态,并在获得轮询连接的结果时更新该变量。

在您的轮询循环中,如果先前的连接结果是网络已连接并且您最近的连接结果是网络已关闭,则调用一个方法(在另一个线程上)将显示气球提示。

这个方法应该显示气球,休眠 X 秒,然后隐藏气球。

有意义吗?

【讨论】:

  • 如果变量以前为假与现在为真,我将如何比较?
  • 创建一个名为 LastPollResult 的变量(在您的类中声明,而不是轮询方法)并将其默认为 false。轮询连接后,将新的轮询结果与 LastPollResult 进行比较,根据比较结果采取行动(如有必要),然后将 LastPollResult 设置为新的轮询结果。
【解决方案2】:

我的想法是这样处理它(伪代码)

class Program
{
    public static bool hasBalloonOpened { get; set; }
    static void Main(string[] args)
    {
        while (network == down)
        {
            if (!hasBalloonOpened) 
            {
                hasBalloonOpened = !hasBalloonOpened;
                BalloonTip.Show();
            }
            //rest of loop or method calls
        }
    }
}

基本上是一个公共布尔值,它告诉循环是否需要打开气球提示,如果需要,它会翻转公共布尔值,因此提示不会再次触发或显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2010-09-22
    • 2019-01-22
    • 2011-09-04
    相关资源
    最近更新 更多