C# 在表单上加载消息
我已经在我的表单上添加了这样的加载消息:C# 在表单上加载消息,c#,winforms,C#,Winforms,我已经在我的表单上添加了这样的加载消息: public void myFunc() { lbl_status.Text = "Loading ... Please Wait"; // Some Database Works lbl_status.Text = "Done"; } 但有一个问题。有时,当我单击按钮时(该按钮执行myFunc方法),我的应用程序不会显示加载消息。它只是执行数据库工作,而不是显示“完成”消息。 我知道有时候数据库工作非常快,所以加载消息不会显示
public void myFunc()
{
lbl_status.Text = "Loading ... Please Wait";
// Some Database Works
lbl_status.Text = "Done";
}
但有一个问题。有时,当我单击按钮时(该按钮执行myFunc
方法),我的应用程序不会显示加载消息。它只是执行数据库工作,而不是显示“完成”消息。
我知道有时候数据库工作非常快,所以加载消息不会显示出来,但有时候没有那么快,就像我第一次打开应用程序一样。在那个时候,我的应用程序似乎被禁用,没有按钮,没有文本框和。。。工作和数据库工作后,它将是确定的,并显示完成的消息,而不再显示加载消息 您可以在后台线程中执行数据库工作:
public void myFunc()
{
lbl_status.Text = "Loading ... Please Wait";
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}
编辑:oops DB works应位于DoWork事件处理程序中:)
对UI对象的任何更新都必须在UI线程上完成 您应该查看Control.Invoke,以提供一种将调用放在控件所在的显示线程上的方法 为了进一步澄清,这也意味着您的大量更新应该在后台线程上完成
WorkerThread可能是一个很好的解决方案。与所有Windows GUI应用程序一样,您的应用程序需要处理GUI事件。正是这些事件完成了诸如刷新标签和使应用程序看起来“有响应性”之类的事情。看见调用以下命令时,winforms应用程序将运行消息循环: 开始在当前线程上运行标准应用程序消息循环 如果在等待数据库工作时阻止处理,则它将停止刷新,并且将无响应(不响应单击或键盘)。因此,您必须在不阻塞主循环的情况下执行数据库。有几种选择:
- 使用一个
- 使用
- 使用异步数据库方法,如和完成回调
- 使用等待方法,如
void bw_DoWork(object sender, DoWorkEventArgs e)
{
// Some Database Works
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lbl_status.Text = "Done";
}