2011-11-23 30 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

您是否需要添加和删除该事件处理程序?你能不能在类的构造函数中添加事件处理程序,然后在销毁类时删除它?这将是控制事件处理的更好方法。除非您以目前的方式添加和删除它的具体原因。 –

相关问题