好的,所以我正在学习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/

10-11 04:38