我想在Windows窗体中自动刷新标签中的结果。此代码有效,但标签中的文字未更改。在我看来,程序必须停止其操作以刷新标签。 我还尝试了http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed.aspx和http://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k(EHInvalidOperation.WinForms.IllegalCrossThreadCall);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true, 但它既不起作用也不起作用。它说线程是不同的,他们不能这样做。 MSNDa代码对我来说也不起作用:(。
private void button1_Click(object sender, EventArgs e)
{
while (true)
{
CaluclateTime();
Thread.Sleep(1000);
}
}
private void CaluclateTime()
{
DateTime zeroDateTime = new DateTime(2014, 9, 16, 15, 00, 0);
//zeroDateTime is a future :).
DateTime now = DateTime.Now;
TimeSpan duration = zeroDateTime - now;
label1.Text = String.Format("Time zero is in: {0}", duration.ToString());
}
答案 0 :(得分:2)
您应该在后台线程中进行处理,但如果您坚持在单个线程中执行此操作,则应阅读以下答案:Force GUI update from UI Thread
编辑(用于相关性):调用Application.DoEvents()
会导致Windows窗体UI处理任何未完成的UI事件,包括Windows Control更新(如标签文本更新)。更新标签Text属性后立即调用此方法。
编辑(用于整体改进):在后台线程中运行长时间运行的进程可让您灵活地让用户执行其他操作(如果您需要),同时执行长时间运行的操作。它为用户构建了更好的用户体验,因为UI始终响应用户所需的响应。
C#中的后台线程技术包括:
答案 1 :(得分:1)
您可以利用async / await
功能:
private async void button1_Click(object sender, EventArgs e)
{
while (true)
{
CaluclateTime();
await Task.Delay(1000);
}
}
并按照以下方式更改CalculateTime
方法:
if (this.InvokeRequired)
this.Invoke(() => label1.Text = String.Format("Time zero is in: {0}", duration.ToString()));
else
label1.Text = String.Format("Time zero is in: {0}", duration.ToString());
另外不要忘记停止循环。