【问题标题】:c# winforms eventsc# winforms事件
【发布时间】:2012-12-21 06:55:43
【问题描述】:

在我的 c# winform 应用程序中,我有一个按钮,当单击该按钮时,它会执行一些可能需要一些时间的计算。

我还有一个label.visible = false,我想在单击按钮后立即发送label.visible = true,以便用户可以看到该应用正在运行。

即使label.visible = truebutton1_Click(object sender, EventArgs e) 方法中的第一件事,它也只会在执行计算后在最后切换到可见。

如何在 button_click 之后立即显示标签?

【问题讨论】:

    标签: c# .net winforms events button


    【解决方案1】:

    如果您需要您的应用程序在处理您的应用程序时保持响应,请查看Background Worker

    您可以通过调用来强制您的表单更新和处理任何后台消息:

    Application.DoEvents();
    

    就在您更改标签之后 - 尽管这可能是一个有点老套的解决方案。

    【讨论】:

    【解决方案2】:

    您的计算正在 UI 线程上执行。这意味着在您设置标签的可见性后,它会阻止 UI 刷新。 您应该考虑使用任务在另一个线程上进行计算。这将允许 UI 在看似可以在后台运行的长时间操作期间做出响应。

    例如

    var taskCalc = Task.Factory.StartNew(() => //Do Calculation );
    

    【讨论】:

      【解决方案3】:

      有几种方法可以解决这个问题。

      一种方法(最简单的)是调用

      this.Refresh();
      

      在您将标签设置为可见之后。

      另一个是在后台线程中进行计算。最简单的方法是使用BackgroundWorker。然后,您的主线程可以在后台工作线程执行计算的同时继续为 UI 提供服务(刷新表单、响应按钮等)。

      有关后台工作线程的更多信息,请参阅http://www.dotnetperls.com/backgroundworker

      【讨论】:

      • 是的,刷新工作正常,但我会继续将代码更改为 backgroundworker,因为它更整洁并且不会挂起 UI。谢谢
      【解决方案4】:

      正如其他人所说:您正在 UI 线程上执行您的工作。我正在向您展示另一种实现您需要的有效方法。您可以使用匿名委托将您的工作移至单独的线程。

      (new System.Threading.Thread(() =>
              {
                  dowork(); // What ever work you need put here.
              })).Start();
      

      【讨论】:

      • 上面的代码,去哪了?或者没关系,甚至可以在button_click方法中,因为它是由另一个线程运行的?
      • 可以在button_Click方法中运行。或者创建一个新方法并从 button_Click 方法调用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2013-10-12
      • 2016-09-30
      相关资源
      最近更新 更多