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中的进度