gpt4 book ai didi

c# - 安排单火事件

转载 作者:行者123 更新时间:2023-11-30 15:10:33 25 4
gpt4 key购买 nike

我正在编写一个应用程序,它需要在加载数据库时更新状态栏。我将标签设置为“数据库加载...”,然后使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com