【问题标题】:Button Click Event not updating textbox until Finished按钮单击事件直到完成才更新文本框
【发布时间】:2015-07-07 16:16:36
【问题描述】:

这是一个 C# 代码,当点击qsubmit 按钮时,程序会立即显示“wait..!”。

当我调试程序时,发现当我单击并且函数执行 textbox1.text = "Hello"; 但不更新文本框时,它仅在控件关闭事件函数时更新,当发生这种情况时,文本框的值已经更改到"wait..!"。我想知道为什么它不立即更新文本框(如果那样的话,我会在Thread.Sleep() 期间看到文本)

 private void Button_QSubmit_Click(object sender, EventArgs e)
 {
      textBox1.Text = "Hello";
      Thread.Sleep(1000);
      textBox1.Text = "Wait..!";  
 }

【问题讨论】:

  • 您正在使用Thread.Sleep() 阻止消息泵,因此它不会更新屏幕。您可能可以致电textBox1.Update() 强制立即重绘
  • @Salim - 这也与多线程无关。 UI 线程就是您在这里使用的全部。这是您通过 Thread.Sleep 调用阻塞的单个线程。
  • 那么我应该用什么来延迟语句的执行,像这样?我的任务是显示一些文本等待半秒并更新/

标签: c# multithreading


【解决方案1】:

UI 线程负责重绘窗口。因此,当您在 UI 线程中执行此操作时(例如,按钮单击事件)long,该过程正忙于处理您的代码并且未绘制窗口。

一个简单的解决方案是使用计时器。只需添加一个计时器,然后在按钮中单击即可启动它(例如,您将其设置为在 1 秒内触发)。

然后定时器事件将简单地设置文本。

https://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx 显示有关 Timer 类的详细信息。

【讨论】:

    【解决方案2】:

    您通过从主线程 (UI) 调用 Thread.Sleep 来挂起 UI 线程,要更新文本框,您必须让 UI 线程在您的函数之外完成其工作以更新 UI..无论如何调用 @987654321 @睡前。 但是调用Application.DoEvents() 是一个糟糕的设计

    【讨论】:

    • 不建议Application.DoEvents()。这很糟糕,而且只有对 VB6 应用程序的旧版支持。
    • @Enigmativity 你是绝对正确的,但我认为这是出于教育目的:) – Ahmad 刚刚编辑
    • @Ahmad 先生,不客气。你已经正确地指出这是一个糟糕的设计,我只是让它更明显。 :)
    • 我应该怎么做,我的意思是如果我想显示一些文本,等待半秒在按钮点击事件上显示另一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2014-01-14
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多