【问题标题】:System.Timer weird behaviorSystem.Timer 奇怪的行为
【发布时间】:2021-10-20 05:31:55
【问题描述】:

抱歉,标题混淆了,但老实说,我不知道该放什么。 所以我创建了一个计时器,它将每隔 T 间隔触发一个事件。这个简单的事件只会附加文本并以 MMORPG 样式显示。它确实有效,但奇怪的是它有时不会触发事件(我解释得对吗?)。

这是图片,所以你可以理解我的意思:

这是我的代码:

baloon = new System.Timers.Timer(30);
baloon.Elapsed += OnTweakTimedEvent_baloon;
//baloon.Elapsed += new ElapsedEventHandler(OnTweakTimedEvent_baloon);

private void OnTweakTimedEvent_baloon(object sender, ElapsedEventArgs e)
{
    lbBaloon.Text += message[letterCount]; 
    letterCount++;
    if (letterCount > message.Length - 1) //stops timer when finishes
    {
        letterCount = 0;
        baloon.Enabled = false;
        lbBaloon.Text = message; // displays the full message when it ends
    }
 }

【问题讨论】:

  • 我想知道你为什么不简单地使用lblBaloon.Text = message.Substring(0, letterCount++);
  • @Llama 啊谢谢你的好主意哈哈,它确实解决了丢失字母的问题,但动画不是很流畅,比如当计时器发生奇怪的事情时,动画非常滞后。如果您做出回答,我会接受您的评论作为答案,但我仍然想知道这种奇怪行为背后的原因是什么。
  • 计时器并不是很好地用于在 winforms 中为任何东西设置动画,基本上你处于计时器精度的极限,令人惊讶的是它甚至可以正常工作。
  • 动画不是很流畅 - 欢迎来到winforms :-(

标签: c# winforms timer


【解决方案1】:

一个相当明显的问题是您在 UI 中使用System.Timers.Timer,而没有任何同步。如果没有SynchronizationContext,此计时器将在后台线程上引发事件,这可能会导致各种问题,因为 UI 类只能由 UI 线程安全访问。

我建议使用 SynchronizationContext 或切换到 winforms 计时器。详情请见timer comparison

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2015-07-20
    • 2010-10-03
    • 2021-07-12
    • 2013-10-04
    • 2019-01-23
    相关资源
    最近更新 更多