C# 为什么在numericUpDown changed事件中调用函数时,会在一段时间后使一切变慢?

C# 为什么在numericUpDown changed事件中调用函数时,会在一段时间后使一切变慢?,c#,C#,这是NumericUpDownValueChanged事件中的代码: private void numericUpDown1_ValueChanged(object sender, EventArgs e) { DoThresholdCheck(); } 这是DoThresholdCheck()代码: private void DoThresholdCheck() { List<int> f; List<string> fts; con

这是
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;
    }
}
private void DoThresholdCheck()
{
清单f;
列出金融时报;
常量字符串D6=“000{0}.bmp”;
if(目录.Exists(子目录名))
{
如果(!File.Exists(子目录名称+“\\”+averagesListTextFile+“.txt”))
{
返回;
}
其他的
{
f=新列表();
fts=新列表();
位图文件;
int计数器=0;
double thershold=(double)numericUpDown1.Value;
双最大最小阈值=(阈值/100)*(最大最小)+最小;
_fi=新目录信息(子目录名称).GetFiles(“*.bmp”);
for(int i=0;i=最大最小阈值)
{
字符串t=i.ToString(“D6”)+“.bmp”;
if(File.Exists(子目录名+“\\\”+t))
{
按钮1.启用=错误;
myTrackPanelss1.trackBar1.Enabled=true;
}
其他的
{
按钮1.启用=真;
myTrackPanelss1.trackBar1.Enabled=false;
pictureBox1.Image=Properties.Resources.Weather\u Michmoret;
标签5.可见=真实;
打破
}
}
}
如果(myTrackPanelss1.trackBar1.Maximum>0)
{
设置图片(0);
myTrackPanelss1.trackBar1.Scroll+=新事件处理程序(trackBar1\u Scroll);
}
如果(_fi.Length>=0)
{
label15.Text=_fi.Length.ToString();
标签15.可见=真实;
}
}
}
其他的
{
按钮1.启用=真;
}
}
我想做的是;每次我更改程序中的
NumericUpDown
值时,它都会在事件中调用该函数。在这种情况下,我每次都会创建一个新的临时列表,并对该列表执行操作和检查

问题是,当我在程序中上下几次更改
NumericUpDown
值,然后尝试再次使用
trackBar1
在图像之间移动时,
trackBar1
移动非常缓慢。最初运行程序时,
trackbar1
中的滑动条快速移动,在图像之间快速移动,但当我更改
NumericUpDown
值时,由于某种原因,轨迹条移动缓慢

例如,我试图添加一个
Timer2
,并可能在
NumericUpDown
中使用它,使其仅在500毫秒后调用函数,但它没有解决这个问题


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

如果是问题的话,我不会上岸,但你似乎在添加事件处理程序
myTrackPanelss1.trackBar1.Scroll+=新的事件处理程序(trackBar1\u Scroll)但从不删除它。因此,您总是添加事件处理程序,在wile
trackBar1\u之后,将触发多次滚动。在
trackBar1\u Scroll
中设置断点,您将看到引发事件处理程序的次数。解决方案可以是删除事件处理程序,也可以只添加一次。

对于初学者来说,您正在执行相当多的IO操作。这可能是一项代价高昂的操作,尤其是在频繁运行时(即在
NumericUpDown
ValueChanged
事件上)。我建议在一些初始化操作中尽可能多地执行这些操作,而不是在每次事件触发时执行

其次,我不确定它是否真的会影响性能,但您一直在将事件处理程序附加到
trackBar1.Scroll
事件。因为我看不到任何地方你从这个事件中分离出来,我想说这是不必要的。您需要更好地控制连接和分离,或者在控制设置期间仅连接一次。创建一个测试程序,看看多次附加同一事件处理程序是否会影响性能,这也是值得的


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

在调用我刚刚添加的函数myTrackPanelss1.trackBar1.Scroll-=new EventHandler(trackBar1\u Scroll)之前,我所做的是在numericupdown changed事件中删除;注销事件处理程序。我不确定这是否是一个好的解决方案,但它可以工作。您需要添加和删除该事件处理程序吗?您是否可以在类构造函数中添加事件处理程序,然后在销毁类时将其删除?这将是控制事件处理的更好方法。除非您以当前方式添加和删除它有特定的原因。