你如何在C#中运行同步计时器?
我正在编写一个应用程序,它使用计时器在某些事件发生时在屏幕上显示倒计时。 我想重用计时器,因为它对应用程序中的一些东西很方便,所以我指定了我想要围绕计时器的单词。 例如,以下函数调用:
CountdownTimer(90, "You have ", " until the computer reboots");
会显示:
You have 1 minute 30 seconds until the computer reboots
然后倒计时。
我使用以下代码:
private void CountdownTimer(int Duration, string Prefix, string Suffix) { Countdown = new DispatcherTimer(); Countdown.Tick += new EventHandler(Countdown_Tick); Countdown.Interval = new TimeSpan(0, 0, 1); CountdownTime = Duration; CountdownPrefix = Prefix; CountdownSuffix = Suffix; Countdown.Start(); } private void Countdown_Tick(object sender, EventArgs e) { CountdownTime--; if (CountdownTime > 0) { int seconds = CountdownTime % 60; int minutes = CountdownTime / 60; Timer.Content = CountdownPrefix; if (minutes != 0) { Timer.Content = Timer.Content + minutes.ToString() + @" minute"; if (minutes != 1) { Timer.Content = Timer.Content + @"s"; } Timer.Content = Timer.Content + " "; } if (seconds != 0) { Timer.Content = Timer.Content + seconds.ToString() + @" second"; if (seconds != 1) { Timer.Content = Timer.Content + @"s"; } } Timer.Content = Timer.Content + CountdownSuffix; } else { Countdown.Stop(); } }
如何同步运行? 例如,我希望以下等待90秒,然后重新启动:
CountdownTimer(90, "You have ", " until the computer reboots"); ExitWindowsEx(2,0)
而目前它立即调用重启。
任何指针都是最受欢迎的!
谢谢,
本
就个人而言,我建议在CountdownTimer结束时进行回调 – 也许将Action
作为参数,这样当它完成时就会被调用。
private Action onCompleted; private void CountdownTimer(int Duration, string Prefix, string Suffix, Action callback) { Countdown = new DispatcherTimer(); Countdown.Tick += new EventHandler(Countdown_Tick); Countdown.Interval = new TimeSpan(0, 0, 1); CountdownTime = Duration; CountdownPrefix = Prefix; CountdownSuffix = Suffix; Countdown.Start(); this.onCompleted = callback; } ... else { Countdown.Stop(); Action temp = this.onCompleted; // thread-safe test for null delegates if (temp != null) { temp(); } }
然后你可以改变你的用法:
CountdownTimer(90, "You have ", " until the computer reboots", () => ExitWindowsEx(2,0));
您可以使用AutoResetEvent:
System.Threading.AutoResetEvent _countdownFinishedEvent = new AutoResetEvent(false);
在CountdownTimer
结束时添加:
_countdownFinishedEvent.WaitOne();
在Countdown.Stop()
之后将其添加到Countdown_Tick
的else中:
_countdownFinishedEvent.Set();
- C#如何设计面板供以后使用..(设置屏幕)
- 在WPF中,如何获取当前主题的按钮背景?
- 来自LINQ的结果,包括用于TimeSpan,GROUP和JOIN的SUM
- 如何在n层体系结构中将entity framework模型类与Business Layer类映射 – ASP.NET-MVC
- C#Process.MainWindowHandle总是返回IntPtr Zero
- XMLWriter:带有标记名称和字符串的WriteStartElement,用于指示标记名称
- 是否有必要在类库中部署XML文件?
- 如何创建匹配的HMAC值以validation.NET中的Shopify WebHook?
- XslCompiledTransform使用UTF-16编码