2012-06-15 116 views
2

好了,所以我学习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方法中,而且它的工作方式与现在所期望的完全相同,只是整理了一下,并实现了一次一页滚动整个页面的方式,而不是一行。

+0

您显示了多少张图片?似乎无法在合理的时间内清除/处理它们。 – Tudor

+0

为了测试的目的,我有一个包含9个图像的文件夹,它一次设置为显示4个。在现实世界中,任何时候都可能需要处理大约60个事件。 – Rich

回答

4

建议在处理WPF中的重复操作时使用System.Windows.Threading.DispatcherTimer。它将自动在dispather线程上执行其代码,而不需要BeginInvoke

+0

谢谢,我将计时器更改为Dispatcher.Timer,不知道那个!内存使用率下降,但总体问题仍然存在。 – Rich

+0

@RMilne:无论如何,很高兴你发现了这个问题。我真的没有想到出了什么问题。也许你应该在解决方案中自己发布答案,并将其标记为已接受。 :) – Tudor