我有窗体。我在PictureBox
当我加载表单时,我已设置
PictureBox1.Visible = false;
当我点击按钮的点击事件时,我已经设置了
PictureBox1.Visible = true;
但是在那种情况下,有一些代码可以通过存储过程从数据库中检索数据。
当它跳转到用于从存储过程检索数据的代码时,加载图像停止加载。
不应该发生。它应该显示为加载。我使用.gif加载图片。
我该如何解决这个问题?
答案 0 :(得分:4)
每次在eventHandler中进行长时间的通话时,您都应该使用 BackgroundWorker ! BackgroundWorker 可以运行代码async ,因此你的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
}
}
答案 1 :(得分:2)
最有可能的是,在运行存储过程时,UI线程被阻止。您可以使用BackGroundWorker
来从数据库中获取数据,这会创建另一个线程并且不会阻止您的主线程。
或者您可以手动创建线程并使用它从数据库中检索数据。 在Windows窗体中,作为最佳实践,最好使用另一个线程来运行外部系统调用,以免阻塞UI线程。
答案 2 :(得分:0)
可能的原因可能是通过加载图像和数据检索来共享相同的线程。因此,您可以尝试使用多线程或异步调用来获取数据。对于以前关于ajax / javascipt web worker的回答,我完全忽略了你提到的windows窗体。