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应用程序将运行消息循环:

开始在当前线程上运行标准应用程序消息循环

如果在等待数据库工作时阻止处理,则它将停止刷新,并且将无响应(不响应单击或键盘)。因此,您必须在不阻塞主循环的情况下执行数据库。有几种选择:

  • 使用一个
  • 使用
  • 使用异步数据库方法,如和完成回调
  • 使用等待方法,如
每种方法都有优缺点,最容易开始的可能是第一种。请注意,在后台线程或完成回调中,与主GUI交互时(即更新表单或其上的任何元素时),必须使用

void bw_DoWork(object sender, DoWorkEventArgs e)
{
    // Some Database Works
}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    lbl_status.Text = "Done";
}