1

我正在调用一个 login() 方法来处理与 mysql 服务器的连接,然后对用户进行身份验证。连接到 mysql 服务器需要一些时间,所以我想放置一个显示“正在加载”状态的标签。我正在做这样的事情:

private void button_login_Click(object sender, EventArgs e)
{
    label_status.Text = "Loading ...";
    login();
}

但我没有看到 label_status 文本更改为“正在加载...”。相反,它会在登录功能恢复后在 label_status 中显示此状态。

我不知道这是为什么?这是一些线程问题吗?任何帮助,将不胜感激。

4

2 回答 2

4

UI 线程将在您的事件处理程序期间被阻塞。如果您希望能够更新 UI,您需要在非 UI 线程中执行长时间运行的任务。BackgroundWorker专为此而设计 。是一个关于如何使用的教程。

您应该在开始之前设置文本BackgroundWorker,设置DoWork要执行的方法login,如果在您登录后需要进行任何 UI 更新,您可以在Completed事件中调用它们。

对于不需要完整 BGW 解决方案的较小案例,您可以使用任务并行库,因为它允许更简单的案例保持简单。以下是使用 TPL 的标准模型:

private void button1_Click(object sender, EventArgs e)
{
    //UpdateUI with stuff to do before long running task

    Task.Factory.StartNew(() => someLongRunningNonUITask())
        .ContinueWith(task => updateUIWithResults(task)
           , TaskScheduler.FromCurrentSynchronizationContext());

}
于 2012-08-16T19:50:23.363 回答
2

快速而肮脏的方法是在更改文本之后调用 login() 方法之前调用 Application.DoEvents()。这将导致标签在调用 login() 方法之前重新绘制。

private void button_login_Click(object sender, EventArgs e) 
{ 
    label_status.Text = "Loading ..."; 
    Application.DoEvents();
    login(); 
} 
于 2012-08-16T20:19:54.760 回答