2012-08-24 95 views
4

我有Windows窗体。我已经把一个装载图像PictureBox加载图像停止问题

当我打开窗体,然后我设置

PictureBox1.Visible = false; 

,而我的触发按钮我已经设置

PictureBox1.Visible = true; 

的单击事件,但在该事件中有是通过存储过程从数据库检索数据的一些代码。

当它跳转到代码从存储过程检索数据加载图像停止加载。

它不应该发生。它应该显示为加载。我已经使用.gif加载图像。

我该如何解决这个问题?

回答

4

每当你有一个事件处理程序中的长久叫你应该使用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 
    } 
} 
0

可能的原因可能是通过加载图像和数据检索共享相同的线程。因此,您可以尝试使用多线程或异步调用来获取数据。对不起以前关于ajax/javascipt web worker的回答,我完全忽略了你提到的windows窗体。

+0

这是Windows应用程序,我不能使用JavaScript或AJAX –

+0

看看这个链接,它可能是有用的 - http://www.yoda.arachsys.com/csharp/threads/winforms.shtml –

2

大多数情况下,当您运行存储过程时,UI线程被阻止。您可以使用BackGroundWorker以从数据库中获取数据,这会创建另一个线程并且不会阻止您的主线程。

或者您可以手动创建一个线程并使用它从数据库检索数据。 在Windows窗体中,作为最佳实践,最好使用另一个线程来运行外部系统调用,以避免阻塞UI线程。

backgroundworker usage