好的,所以我正在学习C#/。NET,到目前为止还停留在winforms上,但是WPF似乎适合该项目。
我有一个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是一个double值,指示WrapPanel中的图像总数(由于与代码中其他地方的另一个double交互,因此需要为double)
xDensity是用户定义的int,它设置水平显示的图像数。
prevResY是每张照片的高度(均相同的分辨率),我将10加上5px的空白余量,这是在填充WrapPanel时设置的。通过乘以迭代,我总是将wrapPanel1向上移动1行。
imgLayout();每次重新浏览所有页面时,都需要检查是否有新图像,然后将所有旧图像都剔除掉,从而重新开始该过程。这全部在imgLayout()中处理。
我只是更新标签,以便在调试时可以随时注意它们,它们恰好返回了我期望的值。
正如您可能从问题标题中收集的那样,我的问题是,随着t2_elapsed的每次迭代,间隔似乎都在增加。如果我将间隔设置为10ms只是为了观察其行为,则延迟似乎会成倍增加。 30秒后,延迟约为25秒,高于最初观察到的0.1秒。 RAM的使用也缓慢增加,这向我暗示,在循环重新启动时,没有处理掉某些资源,不确定是这是原因还是单独的问题。
希望有人能帮忙!如果我做了一些愚蠢的事,就告诉我,我还在学习!
非常感谢
----更新----
好吧,我认为这与
wrapPanel1.Children.Clear();
线。我删除了它,只是让它填满,没有延迟,但这显然不是最终解决方案。无论我把那条线放在哪里,都可以重现问题。
----更新2 ----
好吧,我现在觉得很蠢。在前面的计时器启动的imgLayout()方法中,我使用的是:
t2.Interval = new TimeSpan(0, 0, 0, 0, 5000);
t2.Tick += new EventHandler(t2_Tick);
t2.Start();
每当循环重新启动时,我都会愚蠢地声明事件处理程序。我将其设置为Window_Loaded方法,并且它的工作方式与现在的预期完全一样,只是对其进行了一些整理,并实现了一次滚动整个页面而不是一行的方式。
最佳答案
在WPF中处理重复操作时,建议使用System.Windows.Threading.DispatcherTimer。它将自动在Dispather线程上执行其代码,而无需BeginInvoke
。
关于c# - System.Timers.Timer每次迭代都会衰减,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11049921/