2012-08-24 96 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