gpt4 book ai didi

c# - 如何在标签中显示耗时

转载 作者:行者123 更新时间:2023-11-30 14:01:19 25 4
gpt4 key购买 nike

应该直截了当的不在这里,尽管阅读了很多书,但我仍找不到方法。

我有一个执行耗时功能的按钮。因此,单击按钮时,应在标签中以 500 毫秒的间隔显示耗时(以毫秒为单位)。当达到预期的结果时,我希望计时器停止。 我不只是需要标签中的最后时间(消耗的总时间),但标签应该动态显示耗时。我的代码是:

    private void btnHistory_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
c.StartClock(ref label12);

Utility.PopulateHistory(dgvRecords_history, _util); //time consuming function

c.StopClock();
}

Class1 中我这样写:

    internal void StartClock(ref Label l)
{
Timer t = new Timer();
t.Interval = 500;
t.Enabled = true;
t.Tag = l;
t.Tick += new EventHandler(t_Tick);
t.Start();
}

int i;
bool stop;
void t_Tick(object sender, EventArgs e)
{
if (stop)
{
((Timer)sender).Stop();
return;
}

((Label)((Timer)sender).Tag).Text = (++i).ToString();
}

internal void StopClock()
{
i = 0;
stop = true;
}

发生的情况是,t_Tick 事件仅在触发按钮事件下的完整代码后才会触发。那就是 tick 事件在经过 StopClock 函数后被触发!我不知道为什么会是这样!

基本上是2个问题:

  1. 如何以正确的方式实现我的要求来处理这些问题?我知道我应该使用其他内置类来评估性能,但这只是为了展示目的。为此,理想的方法是什么?

  2. 为什么我的代码不起作用?

编辑:我在这里使用了 System.Windows.Forms Timer,但结果与 System.Timers Timer 没有任何不同

最佳答案

问题是您的长时间运行的任务也在 UI 线程上运行。因此计时器无法触发和更新 UI,因为线程正忙于处理长时间运行的任务。

相反,您应该使用 BackgroundWorker处理长时间运行的任务。

在代码中:

private void btnHistory_Click(object sender, EventArgs e) 
{
Class1 c = new Class1(ref label12);
c.StartClock();

var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (s, e) =>
{
// time consuming function
Utility.PopulateHistory(dgvRecords_history, _util);
};

backgroundWorker.RunWorkerCompleted += (s, e) =>
{
c.StopClock();
};

backgroundWorker.RunWorkerAsync();
}

正如 ChrisWue 所指出的,由于您现在在单独的线程中拥有长时间运行的任务,因此它需要在 UI 线程上调用对 UI 控件的任何访问。

如果您的长时间运行的任务只需要来自 UI 的一些数据来启动,您可以将该数据作为 RunWorkerAsync() 的参数传递。如果您需要将一些结果数据输出到 UI,您可以在 RunWorkerCompleted 事件的处理程序中执行此操作。如果您偶尔需要在取得进展时更新 UI,您可以在 ProgressChanged 事件的处理程序中执行此操作,在您的 DoWork 处理程序中调用 ReportProgress()

如果以上都不需要,您可以使用 ThreadPool,如 StaWho 的回答。

关于c# - 如何在标签中显示耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8600657/

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