2011-11-23 27 views
0

這是NumericUpDownValueChanged事件的代碼:爲什麼在numericUpDown changed事件中調用函數時會讓一切都變慢?

private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
{ 
    DoThresholdCheck(); 
} 

這是DoThresholdCheck()代碼:

private void DoThresholdCheck() 
{ 

    List<int> f; 
    List<string> fts; 
    const string D6 = "000{0}.bmp"; 
    if (Directory.Exists(subDirectoryName)) 
    { 



     if (!File.Exists(subDirectoryName + "\\" + averagesListTextFile + ".txt")) 
     { 
      return; 
     } 
     else 
     { 




       f = new List<int>(); 
       fts = new List<string>(); 
       Bitmap myFiles; 
       int counter = 0; 
       double thershold = (double)numericUpDown1.Value; 
       double max_min_threshold = (thershold/100) * (max - min) + min; 
       _fi = new DirectoryInfo(subDirectoryName).GetFiles("*.bmp"); 


       for (int i = 0; i < myNumbers.Count; i++) 
       { 
        if (myNumbers[i] >= max_min_threshold) 
        { 
         string t = i.ToString("D6") + ".bmp"; 
         if (File.Exists(subDirectoryName + "\\" + t)) 
         { 
          button1.Enabled = false; 
          myTrackPanelss1.trackBar1.Enabled = true; 



         } 
         else 
         { 
          button1.Enabled = true; 
          myTrackPanelss1.trackBar1.Enabled = false; 
          pictureBox1.Image = Properties.Resources.Weather_Michmoret; 
          label5.Visible = true; 
          break; 
         } 
        } 
       } 
       if (myTrackPanelss1.trackBar1.Maximum > 0) 
       { 
        SetPicture(0); 
        myTrackPanelss1.trackBar1.Scroll += new EventHandler(trackBar1_Scroll); 
       } 
       if (_fi.Length >= 0) 
       { 
        label15.Text = _fi.Length.ToString(); 
        label15.Visible = true; 
       } 




     } 
    } 
    else 
    { 
     button1.Enabled = true; 
    } 
} 

我想要做的是;每次我更改程序中的NumericUpDown值時,它都會調用該事件中的函數。如果我每次創建一個新的臨時列表並執行操作並對該列表進行一些檢查。

問題是當我在程序中上下數次更改NumericUpDown值,然後嘗試使用trackBar1再次在圖像之間移動時,trackbar1移動得非常緩慢。最初運行程序時,trackbar1中的滑動條快速移動並在圖像間快速移動,但當更改NumericUpDown值時,由於某種原因,軌跡欄緩慢移動。

我試着添加一個Timer2,也許在NumericUpDown中用它來使它在500ms後才能調用函數,但是它沒有解決它。

我不明白爲什麼它的移動太慢了。

回答

1

如果是問題,我不支持,但似乎你添加事件處理程序myTrackPanelss1.trackBar1.Scroll += new EventHandler(trackBar1_Scroll);,但永遠不會刪除它。所以你總是添加事件處理程序,並在經過一段時間後會被解僱很多次。在trackBar1_Scroll中設置斷點,您將看到引發事件處理程序的次數。解決方案可以刪除事件處理程序或只添加一次。

1

對於初學者,您正在執行相當多的IO操作。這可能是一項成本高昂的操作,尤其是當您頻繁運行時(即在NumericUpDownValueChanged事件中)。我建議在一些初始化操作中儘可能多地執行此操作,而不是在每次事件觸發時執行此操作。其次,我不確定它是否會影響性能,但是您不斷將事件處理程序附加到trackBar1.Scroll事件。由於我沒有看到你從這個事件中脫離的任何地方,我會說這是不必要的。要麼您需要更好地控制附件和拆卸,或者只需在控制設置過程中連接一次。也許值得創建一個測試程序來查看是否多次連接相同的事件處理程序會影響性能。

最後,您可以通過創建一個後臺工作器來執行此操作,每次執行此操作時都會發出信號。如果您使用等待句柄,則可以以類似隊列的方式運行該操作。這將不會影響您的UI操作,但您必須小心使用哪些UI函數,因爲它們只能在UI線程上調用。如果你想了解更多這方面的信息,請告訴我,我會給你一個簡單的例子。

+0

斯萊德我所做的是在調用函數之前,在數字下降更改事件我剛剛添加myTrackPanelss1.trackBar1.Scroll - = new EventHandler(trackBar1_Scroll);取消註冊事件處理程序。我不知道它是一個很好的解決方案,但它的工作。 –

+0

您是否需要添加和刪除該事件處理程序?你能不能在類的構造函數中添加事件處理程序,然後在銷燬類時刪除它?這將是控制事件處理的更好方法。除非您以目前的方式添加和刪除它的具體原因。 –

相關問題