好了,所以我学习C#/。NET衰减和迄今坚持的WinForms,但WPF似乎适合这个项目。System.Timers.Timer在每次迭代
我有一个显示图像的阵列的WrapPanel。有时候这个数组会超出窗口的范围。我试图循环浏览“页面”,直到所有图像都使用计时器显示出来。
我将开始在计时器事件经过我的代码示例,在这一点上我的WrapPanel(wrapPanel1)已经被填充,检查是否存在溢出:
public void t2_Elapsed(object source, ElapsedEventArgs e)
{
wrapPanel1.Dispatcher.BeginInvoke((ThreadStart)delegate
{
remaining = Convert.ToInt32(imgCount) - (iteration*xDensity);
label1.Content = iteration;
label2.Content = remaining;
label3.Content = imgCount;
if (remaining <= 1)
{
Thickness marginTop = wrapPanel1.Margin;
marginTop.Top = 0;
wrapPanel1.Margin = marginTop;
wrapPanel1.Children.Clear();
t2.Stop();
imgLayout();
}
else
{
Thickness marginTop = wrapPanel1.Margin;
marginTop.Top = -((prevResY+10) * iteration);
wrapPanel1.Margin = marginTop;
iteration++;
}
});
}
imgCount是双指示WrapPanel中的图像总数(由于与其他代码中的另一个双向交互,需要双倍)
xDensity是用户定义的int,用于设置水平显示的图像数量。
prevResY是每张照片(所有相同的分辨率)的高度,我加10,以考虑5px的余量填充WrapPanel时被设置的所有轮。通过乘以迭代,我总是将wrapPanel1向上移动1行。
imgLayout();因为每次我浏览所有需要检查的图片时,我会检查是否有任何新图片,并敲掉任何新图片。这全部在imgLayout()中处理。
我更新标签,这样我可以保持它的眼睛在调试时,他们返回正是我所期待的值。
正如你可能已经从问题的标题云集,我的问题是,我t2_elapsed的每次迭代,间隔似乎增加。如果我将间隔设置为10ms以观察其行为,则看起来延迟呈指数增长。 30秒之后,延迟时间大约为25秒,从最初的0.1开始。内存使用率也在慢慢攀升,这暗示着当循环重新启动时一些资源没有被处置掉,不知道这是原因还是单独的问题。
希望有人能帮助!如果我做了一些愚蠢的事情,告诉我,我还在学习!
非常感谢
---- ---- UPDATE
好了,所以我觉得它的东西做的
wrapPanel1.Children.Clear();
线。我删除它,只是让它充满了,我没有得到任何延迟,但这显然不是最终的解决方案。无论我放置哪条线,都会重现问题。
---- UPDATE ----
嗯,我现在感觉相当愚蠢的。
t2.Interval = new TimeSpan(0, 0, 0, 0, 5000);
t2.Tick += new EventHandler(t2_Tick);
t2.Start();
我每次循环重启时间愣神声明事件处理程序:在计时器开始我用的是imgLayout()方法更早。我将其设置在Window_Loaded方法中,而且它的工作方式与现在所期望的完全相同,只是整理了一下,并实现了一次一页滚动整个页面的方式,而不是一行。
您显示了多少张图片?似乎无法在合理的时间内清除/处理它们。 – Tudor
为了测试的目的,我有一个包含9个图像的文件夹,它一次设置为显示4个。在现实世界中,任何时候都可能需要处理大约60个事件。 – Rich