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

BackgroundWorker update elapsed time label using stopwatch, freeze due to invoke C#

我正在尝试在用户控件内的后台工作程序中创建一个 运行 的实时秒表,并且我正在使用 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 .

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

我发现应该使用 Timer 而不是 Background worker 来解决此类问题。

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;
}```