【问题标题】:How to display results in label in while(true) loop如何在while(true)循环中以标签显示结果
【发布时间】:2014-08-30 15:02:16
【问题描述】:

我想在 Windows 窗体的标签中自动刷新我的结果。此代码有效,但标签中的文本未更改。在我看来,程序必须停止他们的操作来刷新标签。 我也试过http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed.aspxhttp://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());
    }

【问题讨论】:

  • 如果您使用System.Timers.Timer 计时器,请确保设置了SynchronizingObject 属性。有关示例,请参阅this answer。没有它,它会抛出 CrossThreadExceptions。

标签: c# while-loop label


【解决方案1】:

您应该在后台线程中进行处理,但如果您坚持在单个线程中进行处理,您应该阅读此答案:Force GUI update from UI Thread

编辑(相关性):调用Application.DoEvents() 会导致Windows 窗体UI 处理任何未完成的UI 事件,包括Windows 控件更新,如标签文本更新。更新标签文本属性后立即调用此方法。

编辑(用于整体改进):在后台线程中运行长时间运行的进程可以让您灵活地让用户在执行长时间运行的操作时执行其他操作(如果您愿意) .它为用户构建了更好的用户体验,因为 UI 始终响应用户的需求。

C# 中的后台线程技术包括:

【讨论】:

  • 您能否将该链接中的相关部分添加到您的答案中?仅链接的答案在这里不受欢迎,因为如果链接页面被更改或删除,它们往往会变得无用。
  • 太棒了!如果您可以添加一个有关如何使用该方法的示例,并且还详细说明您为什么建议在后台线程中进行处理(只是说某些事情不好而不解释为什么不是很好,那么您的答案可能会得到进一步改进)有帮助!)。
【解决方案2】:

您可以利用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());

别忘了停止你的循环。

【讨论】:

    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多