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

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

但我看不到label_status文本更改为“正在加载...”。取而代之的是,登录功能恢复后,它将在label_status中显示此状态。

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

最佳答案

在事件处理程序的持续时间内,UI线程将被阻止。如果您希望能够更新UI,则需要在非UI线程中执行长时间运行的任务。 BackgroundWorker是专门为此目的而设计的。 Here是有关如何使用它的教程。

您应该在启动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());

}

关于c# - 在C#中的函数调用之前设置标签的文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11994389/

10-17 01:08