c# - System.Timers.Timer 随着每次迭代而衰减

标签 c# wpf timer

好吧,我正在学习 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 以占满周围 5 像素的边距,这是在填充 WrapPanel 时设置的。通过乘以迭代,我总是将 wrapPanel1 向上移动 1 行。

imgLayout();重新开始这个过程,因为每次我浏览所有页面时,我都需要检查是否有任何新图像,并把所有旧图像从末尾剔除。这一切都在 imgLayout() 中处理。

我更新标签只是为了在调试时可以密切关注它,它们返回的值正是我期望的值。

正如您可能从问题标题中了解到的那样,我的问题是,随着 t2_elapsed 的每次迭代,间隔似乎都在增加。如果我将间隔设置为 10 毫秒只是为了观察其行为,那么延迟似乎会呈指数增长。 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 方法中,它的工作方式与人们现在所期望的完全一样,只是稍微整理一下并实现了一种一次滚动整个页面而不是仅滚动一行的方法。

最佳答案

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

关于c# - System.Timers.Timer 随着每次迭代而衰减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11049921/

相关文章:

c# - HTTP ://and https://web service?

c# - Datatable LINQ select datarow 只返回一行以及如何排序

c# - 不支持的媒体类型 web api 发布

c# - 在 SelectionChanged 事件(列表框 : SelectionMode=Multiple), 中,第一个选择的项目总是返回而不是当前的

c# - LINQ 计数 其中 1 列有两个 int

c# - 下载视频时,YoutubeExtractor上的System.Net.WebException

delphi - 在 Delphi 中编程延迟的最佳方法是什么?

python - 如何运行 Python 程序来定期更新现有的 pandas DataFrame?

Java 定时器类 : timer tasks stop to execute if in one of the tasks exception is thrown

c# - 从工作线程刷新 DataGrid