c# - 安排单火事件

标签 c# .net timer

我正在编写一个应用程序,它需要在加载数据库时更新状态栏。我将标签设置为“数据库加载...”,然后使用 BackgroundWorker 加载数据库。工作人员完成后,我将标签设置为“数据库已加载”。但是,这仅在启动时完成,我不希望标签显示的时间更长,并且希望在工作人员完成后几秒钟内将其清除。我可以在我的 main for 上放置一个专用的计时器对象,但是这个单一的 Action 将是它唯一的工作,而且似乎应该存在一个更优雅的解决方案。所以我尝试了 lambda:

void dataLoader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    DataLabel.Text = "Database Loaded";
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
    timer.Interval = 5000;
    timer.Tick += new EventHandler((o, a) =>
    {
        DataLabel.Text = "";
        (o as System.Windows.Forms.Timer).Enabled = false;
    });
}

当然timer的作用域在函数退出后就过期了,它的Tick事件永远不会被调用。

如何在不使用全局实例计时器的情况下运行简单的单次触发事件?

最佳答案

您的代码基本没问题。事实上,在我看来,您的通用架构是最优雅的解决方案。你只是忘了启动计时器。您不必担心 GC 会过早地收集计时器,因为它实际上会在启动时自动“root”自己。这当然会引出一个问题,即这是否会导致内存泄漏,因为每次都会创建一个新的计时器。我认为不会,因为计时器在停止时也会“取消根”。所以以下应该可以正常工作。

void dataLoader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)  
{  
    DataLabel.Text = "Database Loaded";  
    var timer = new System.Windows.Forms.Timer();  
    timer.Interval = 5000;  
    timer.Tick += (o, a) =>  
    {  
        timer.Stop();
        DataLabel.Text = "";
    };
    timer.Start();
}  

关于c# - 安排单火事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238040/

相关文章:

c# - 将 WCF 服务限制为特定用户帐户的最佳方法

c++ - 有没有办法减少我的简单 2D DirectX 游戏中的 CPU 和 GPU 负载?

c# - 如何检查给定的电子邮件地址是否确实存在于 C# 中?

c# - 如何在 ObservableCollection<T> 中使用 GetType 返回的类型?

c# - VB 的 "Dim"语句在 C# 中的等价物是什么?

c# - 如何声明多个计时器并在时间到期时停止计时器

C++ OpenGL Pong 球移动得太快

c# - 在保存时格式化文档,在 vscode 上删除未使用的使用

c# - 从 C# 中的 Object 继承是多余的吗?

c# - 打印对象列表中所有属性的最佳方法是什么?