我有Windows窗体。我已经把一个装载图像PictureBox
加载图像停止问题
当我打开窗体,然后我设置
PictureBox1.Visible = false;
,而我的触发按钮我已经设置
PictureBox1.Visible = true;
的单击事件,但在该事件中有是通过存储过程从数据库检索数据的一些代码。
当它跳转到代码从存储过程检索数据加载图像停止加载。
它不应该发生。它应该显示为加载。我已经使用.gif加载图像。
我该如何解决这个问题?
我有Windows窗体。我已经把一个装载图像PictureBox
加载图像停止问题
当我打开窗体,然后我设置
PictureBox1.Visible = false;
,而我的触发按钮我已经设置
PictureBox1.Visible = true;
的单击事件,但在该事件中有是通过存储过程从数据库检索数据的一些代码。
当它跳转到代码从存储过程检索数据加载图像停止加载。
它不应该发生。它应该显示为加载。我已经使用.gif加载图像。
我该如何解决这个问题?
每当你有一个事件处理程序中的长久叫你应该使用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
}
}
可能的原因可能是通过加载图像和数据检索共享相同的线程。因此,您可以尝试使用多线程或异步调用来获取数据。对不起以前关于ajax/javascipt web worker的回答,我完全忽略了你提到的windows窗体。
大多数情况下,当您运行存储过程时,UI线程被阻止。您可以使用BackGroundWorker
以从数据库中获取数据,这会创建另一个线程并且不会阻止您的主线程。
或者您可以手动创建一个线程并使用它从数据库检索数据。 在Windows窗体中,作为最佳实践,最好使用另一个线程来运行外部系统调用,以避免阻塞UI线程。
这是Windows应用程序,我不能使用JavaScript或AJAX –
看看这个链接,它可能是有用的 - http://www.yoda.arachsys.com/csharp/threads/winforms.shtml –