2014-02-14 26 views
0

當我做長時間運行的任務,然後我想顯示繁忙的圖像,並在作業完成時隱藏繁忙的圖像。如何顯示隱藏忙圖像異步

private void btnSave_Click(object sender, EventArgs e) 
     { 
      string strRating = ""; 
      Messages oErrMsg = Messages.Instance; 
      FeedBack oFeedBack = new FeedBack(); 
      picbox.Visible = true; 

      Application.DoEvents(); 

      if (cboRating.Text.Trim() == "--Select--") 
      { 
       strRating = ""; 
      } 
      else 
      { 
       strRating = cboRating.Text.Trim(); 
      } 

      try 
      { 

       oErrMsg = oFeedBack.UpdateFeedBack(JobID, strRating, txtComments.Text.Trim(), AccountRef, PartNumber); 
       if (!oErrMsg.IsError) 
       { 
        picbox.Visible = false; 
        comments _cmm = new comments(); 
        _cmm.Comments = txtComments.Text; 
        _cmm.Rating = strRating; 
        _cmm.Row = this.Row; 
        _cmm.Col = this.Col; 
        OnValueChanged(_cmm); 

        DialogResult = DialogResult.OK; 
        this.Close(); 
       } 
       else 
       { 
        picbox.Visible = false; 
        MessageBox.Show(oErrMsg.Message); 
       } 
      } 
      catch (Exception ex) 
      { 
       picbox.Visible = false; 
      MessageBox.Show(ex.Message.ToString()); 
     } 
    } 

picbox.Visible = true; 

picbox有忙的圖像,但問題是圖像不顯示,因爲我是顯示忙,然後一個長期運行的操作開始。所以引導我如何能夠異步顯示繁忙的圖像並在作業完成時隱藏。感謝

+0

關於Windows繪製窗口的方式非常重要,它只發生在沒有其他任何事情必須完成時。如果線程恐懼,然後添加picBox.Update()來強制控件被繪製。 –

回答

1

正如@Piotr建議的那樣,您可以使用BackgroundWorker線程來實現此目的。

作爲一個推理,爲什麼你的代碼不工作,btn點擊處理程序在UI線程上運行,並且恰好在同一個(UI)線程中執行所有工作,這意味着UI線程無法在繁忙的指標。

雖然Application.DoEvents()有助於強制重繪,但應該避免它,並且實現此目的的正確方法是將所有工作委託給後臺線程(您也可以使用ThreadPool.QueueUserWorkItem)並編組對UI的所有更改通過使用Control.BeginInvoke/Control.Invoke將對象/屬性添加到UI線程。

因爲,在UI對象的任何變化可能僅在UI線程來完成你將不得不使用Control.Invoke等

BackgrounWorker級名帥這樣的更新通過提供differenet事件處理程序封裝此編組。從內存中,我減少了ProgressChanged和Completed處理程序在UI線程上的調用。因此,您可以安全地更新這些處理程序中的UI控件,並在DoWork處理程序中執行耗時的工作。

更新:這裏是很好的解釋爲什麼DoEvents is Evil

+0

爲什麼你建議避免Application.DoEvents()PLzz解釋Application.DoEvents()中的錯誤?謝謝 – Thomas

+0

Doevent處理消息隊列中的所有消息(而不僅僅是重繪)。在回答一個好帖子的時候更新了詳細的解釋。 –