为什么当调用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后调用函数,例如,但它没有解决它。
我不明白为什么它走得这么慢。
我不是岸边,如果这是问题,但似乎你添加事件处理程序myTrackPanelss1.trackBar1.Scroll += new EventHandler(trackBar1_Scroll);
,但从未删除它。所以你总是添加事件处理程序,一段时间后,trackBar1_Scroll
将被多次触发。在trackBar1_Scroll
中设置断点,您将看到事件处理程序被触发的次数。解决方案可以是删除事件处理程序或只添加一次。
对于初学者来说,您正在执行相当多的IO操作。这可能是一个代价高昂的操作,特别是当您频繁运行它时(例如,在NumericUpDown
的ValueChanged
事件上)。我建议在一些初始化操作中尽可能多地执行这些操作,而不是在每个事件触发时执行。
其次,我不确定它是否真的会影响性能,但是您一直将事件处理程序附加到trackBar1.Scroll
事件。因为我没有看到你在任何地方脱离这个事件,我想说这是不必要的。要么你需要更好地控制连接和分离,要么在控制设置期间简单地连接一次。可能还值得创建一个测试程序,以查看多次附加相同的事件处理程序是否会影响性能。
最后,您可以通过创建一个后台worker来执行此操作,每次收到信号时都在其上执行此操作。如果使用等待句柄,则可以以类似队列的方式运行该操作。这不会影响你的UI操作,但是你必须小心你调用的UI函数,因为它们只能在UI线程上调用。如果您想了解更多,请告诉我,我将给您一个简短的例子。