为什么当调用numericUpDown事件中的函数时,一段时间后一切都变慢了

本文关键字:一段时间 numericUpDown 调用 事件 函数 为什么 | 更新日期: 2023-09-27 18:15:33

这是NumericUpDown ValueChanged事件中的代码:

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后调用函数,例如,但它没有解决它。

我不明白为什么它走得这么慢。

为什么当调用numericUpDown事件中的函数时,一段时间后一切都变慢了

我不是岸边,如果这是问题,但似乎你添加事件处理程序myTrackPanelss1.trackBar1.Scroll += new EventHandler(trackBar1_Scroll);,但从未删除它。所以你总是添加事件处理程序,一段时间后,trackBar1_Scroll将被多次触发。在trackBar1_Scroll中设置断点,您将看到事件处理程序被触发的次数。解决方案可以是删除事件处理程序或只添加一次。

对于初学者来说,您正在执行相当多的IO操作。这可能是一个代价高昂的操作,特别是当您频繁运行它时(例如,在NumericUpDownValueChanged事件上)。我建议在一些初始化操作中尽可能多地执行这些操作,而不是在每个事件触发时执行。

其次,我不确定它是否真的会影响性能,但是您一直将事件处理程序附加到trackBar1.Scroll事件。因为我没有看到你在任何地方脱离这个事件,我想说这是不必要的。要么你需要更好地控制连接和分离,要么在控制设置期间简单地连接一次。可能还值得创建一个测试程序,以查看多次附加相同的事件处理程序是否会影响性能。

最后,您可以通过创建一个后台worker来执行此操作,每次收到信号时都在其上执行此操作。如果使用等待句柄,则可以以类似队列的方式运行该操作。这不会影响你的UI操作,但是你必须小心你调用的UI函数,因为它们只能在UI线程上调用。如果您想了解更多,请告诉我,我将给您一个简短的例子。