我有窗口形式。我放了一张加载图片PictureBox
当我加载表格时,我已经设置
PictureBox1.Visible = false;
当我触发我设置的按钮的点击事件时
PictureBox1.Visible = true;
但在那种情况下,有一些代码可以通过存储过程从数据库中检索数据。
当它将跳转到用于从加载图像停止加载的存储过程中检索数据的代码。
它不应该发生。它应该显示为正在加载。我使用了 .gif 加载图像。
我该如何解决这个问题?
每次您在 eventHandler 中进行长时间的调用时,您都应该使用BackgroundWorker!BackgroundWorker可以异步运行代码,因此您的 button_click eventHandler 将在启动 worker 后立即结束。
// add a BackGroundWorker bwLoadData to your form
private void YOURBUTTON_Click(object sender, EventArgs e)
{
PictureBox1.Visible = true;
bwLoadData.RunWorkerAsync();
}
private void bwLoadData_DoWork(object sender, DoWorkEventArgs e)
{
// access your db, execute storedProcedue and store result to
e.Result = YOUR_DATASET_RECORDS_OR_ANYTHING_ELSE;
}
private void bwLoadData_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Result != null)
{
// e.g. show data on form
} else {
// e.g. error message
}
}
最有可能的是,当您运行存储过程时,UI 线程被阻塞了。您可以使用 aBackGroundWorker
来从数据库中获取数据,这会创建另一个线程并且不会阻塞您的主线程。
或者您可以手动创建一个线程并使用它从数据库中检索数据。在 Windows 窗体中,作为最佳实践,最好使用另一个线程来运行外部系统调用,以免阻塞 UI 线程。
造成这种情况的可能原因可能是通过加载图像和数据检索来共享同一线程。因此,您可以尝试使用多线程或异步调用来获取数据。很抱歉之前关于 ajax / javascipt web worker 的回答,我完全忽略了你提到的 windows 窗体。