BackgroundWorker使用秒表更新经过的时间标签,由于调用C#而冻结[重复]

Posted

技术标签:

【中文标题】BackgroundWorker使用秒表更新经过的时间标签,由于调用C#而冻结[重复]【英文标题】:BackgroundWorker update elapsed time label using stopwatch, freeze due to invoke C# [duplicate] 【发布时间】:2020-01-25 03:07:33 【问题描述】:

我正在尝试创建一个实时秒表,它在用户控件内的后台工作人员中运行,并且我正在使用 Invoke 方法更新 UI 中经过时间的标签,当 2 个后台工作人员正在运行时它可以正常工作同时。

我注意到问题是我试图每秒调用标签,并且乘以我创建的用户控件的数量,所以它冻结了我试图评论调用方法,它工作得很好,但我不能'不使用调用方法更新标签。

public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

     Stopwatch stopWatch = new Stopwatch();
     stopWatch.Start();
     while (!backgroundWorker1.CancellationPending)
     
         TimeSpan ts = stopWatch.Elapsed;
         string elapsedTime = String.Format("0:00:1:00:2:00", ts.Hours,ts.Minutes, ts.Seconds);               
         label2.Invoke((MethodInvoker)delegate
         
             label2.Text = elapsedTime;
         );
     
     stopWatch.Stop();

这是生成的使用秒表的用户控件的图像 https://i.stack.imgur.com/mAQLP.png .

考虑到我可能同时运行多个用户控件,我如何在不冻结应用程序的情况下使用已用时间更新标签。

【问题讨论】:

Invoke 在这里真的不应该受到责备 - 尝试不断更新表单上的元素将冻结表单,无论您如何执行此操作。 @AlexeiLevenkov 我注意到这不是最好的方法 @AlexeiLevenkov 所以没有愚蠢的方法来制作实时秒表吗? 【参考方案1】:

我认为我应该使用 Timer 而不是可以用于此类问题的后台工作人员。

Stopwatch sw = new Stopwatch();

private void timer1_Tick(object sender, EventArgs e)

    long h = sw.Elapsed.Hours;
    long m = sw.Elapsed.Minutes;
    long s = sw.Elapsed.Seconds;
    long t = sw.Elapsed.Ticks;

    string strH = (h < 10) ? "0" + h : h + "";
    string strM = (m < 10) ? "0" + m : m + "";
    string strS = (s < 10) ? "0" + s : s + "";
    string AllTime = strH + ":" + strM +":"+ strS;

    label2.Text = AllTime;
```

【讨论】:

以上是关于BackgroundWorker使用秒表更新经过的时间标签,由于调用C#而冻结[重复]的主要内容,如果未能解决你的问题,请参考以下文章

自动滚动到由 backgroundworker 更新的多行文本框的底部

BackgroundWorker UI不会更新Windows Phone 7中的进度

如何正确实现带有 ProgressBar 更新的 BackgroundWorker?

使用BackgroundWorker

秒表或计时器

如何使用 BackGroundWorker 刷新 DataGridView