如何在c#中使foreach循环更快?



我在我的timer_tick方法中每10毫秒调用这段代码它运行正常,除非我添加更多的控件到列表。

我试着在线程中运行它。在while()循环中睡觉,但它似乎冻结了我的整个形式。

我怎样才能使这个代码运行得更快,并改变我的控件的位置?控制的类型有区别吗?我应该使用面板而不是图片框吗?

下面是我的代码:

private void notepreview_Tick(object sender, EventArgs e)
{

Invoke(new Action(() =>
{
foreach (PictureBox picbox in activeNotes)
{
picbox.Location = new Point(picbox.Location.X, picbox.Location.Y + 1);
//Console.WriteLine("x: " + picbox.Location.X);
//Console.WriteLine("y: " + picbox.Location.Y);
if (picbox.Location.Y > this.Height + 5)
{
picbox.Dispose();
tabPage16.Controls.Remove(picbox);
}
}
}));
}

,下面是它在我的表单中的样子:(每个音符都是单独产生的,所以延迟会慢慢上升,导致与音频和钢琴不同步)

imgur表单滞后展示

也许我应该用gdi+代替?它会提高性能吗?

我试着在这个问题的一个单独的线程中运行代码:从一个单独的线程访问一个窗体's控件

(听说使用FOR循环而不是foreach更快,但在这种情况下并没有真正的区别)

您可以尝试在循环上调用SuspendLayoutResumeLayout,因此它不会为每个操纵的控件更新自己…但除此之外,如果它没有帮助,可能没有什么好方法可以让它更快。

而不是使用多个PictureBox在你的形式,你动画的每个音符,考虑绘制移动音符矩形的整个场景到单个Graphics,你渲染到单个PictureBox。这也有一个方便的属性,能够完全确定地呈现,所以你可以准确地将它与你的音频同步。

相关内容

  • 没有找到相关文章

最新更新