我正在调用一个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/