我是一名初学者,正在做一些C#练习。我了解到森林火灾模型,并尝试使用WPF进行绘制,我使用画布为每个像素创建矩形。
问题是程序会冻结,画布不会绘制任何东西(在while(true)循环中)。而且,即使在迭代后删除所有子元素,程序仍然会收集GB的内存。
测试简化代码:
我尝试在线程中绘制“DrawForestFire()”,并使用“this.Dispatcher.Invoke(() => { ... });”中的画布对象,但对我来说没有任何区别。出了什么问题?
还有,除了Canvas,是否有更好的方法来执行这种操作?
测试简化代码:
public partial class TestDrawing : Window
{
public TestDrawing()
{
InitializeComponent();
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
DrawForestFire();
}
private void DrawForestFire()
{
Random rand = new Random();
while (true)
{
for (int y = 0; y < 100; y++)
{
for (int x = 0; x < 100; x++)
{
Rectangle rectangle = new Rectangle();
Color color = Color.FromRgb((byte)rand.Next(200),
(byte)rand.Next(200), (byte)rand.Next(200));
rectangle.Fill = new SolidColorBrush(color);
rectangle.Width = 4;
rectangle.Height = 4;
Canvas.SetTop(rectangle, y * 4);
Canvas.SetLeft(rectangle, x * 4);
canvas.Children.Add(rectangle);
}
}
canvas.Children.Clear();
}
}
}
我尝试在线程中绘制“DrawForestFire()”,并使用“this.Dispatcher.Invoke(() => { ... });”中的画布对象,但对我来说没有任何区别。出了什么问题?
还有,除了Canvas,是否有更好的方法来执行这种操作?
while (true)
,而是使用计时器,例如 DispatcherTimer。 - Clemens