C# 不能在循环中无效?

C# 不能在循环中无效?,c#,winforms,drawing,C#,Winforms,Drawing,我有以下代码: for(int I=0;I<10;I++) { graphics.DrawImage(image, i*20,50); invalidate(); } for(int I=0;I因为它处于一个紧密的循环中,所以在循环完成之前,它实际上不会处理重绘。您可以通过在invalidate之后添加来强制它处理重绘消息,如下所示: for(int I=0;I<10;I++) { graphics.DrawImage(image, i*20,50);

我有以下代码:

for(int I=0;I<10;I++) 
{  
 graphics.DrawImage(image, i*20,50);  
 invalidate(); 
}

for(int I=0;I因为它处于一个紧密的循环中,所以在循环完成之前,它实际上不会处理重绘。您可以通过在invalidate之后添加来强制它处理重绘消息,如下所示:

for(int I=0;I<10;I++)
{
    graphics.DrawImage(image, i*20,50);
    invalidate(); 
    Application.DoEvents();
}

for(int I=0;I因为它处于一个紧密的循环中,所以在循环完成之前,它实际上不会处理重绘。您可以通过在invalidate之后添加来强制它处理重绘消息,如下所示:

for(int I=0;I<10;I++)
{
    graphics.DrawImage(image, i*20,50);
    invalidate(); 
    Application.DoEvents();
}

for(int I=0;I因为
Invalidate
不会立即重新绘制,它只是告诉您需要重新绘制。当方法完成且程序再次空闲时,将执行重新绘制


快速而肮脏的解决方案是添加
Application.DoEvents()
在调用
Invalidate
之后,但是我建议重写逻辑,使用计时器或类似的东西,而不是使用循环来制作动画。

因为
Invalidate
不会立即重新绘制,它只是告诉需要重新绘制。当方法完成,并且程序再次空闲时,重新绘制将被删除她表演得很好


快速而肮脏的解决方案是添加
Application.DoEvents()
在调用
Invalidate
后,我建议重写逻辑,使用计时器或类似的东西,而不是使用循环来制作动画。

你为什么在意?绘制每个图像是否需要很长时间?你问的问题不对。我不会在这样的循环中进行更新。告诉我们你真正想要实现的目标我们会给你一个替代方案。你为什么在意?绘制每张图像需要很长时间吗?你问了一个错误的问题。我不会在这样的循环中进行更新。告诉我们你真正想要实现的是什么,我们会给你一个替代方案。实际上,这只是移动的处理。for循环移动敌人。anyway,通过添加一个表示帧的计时器,您将能够避免hacky Application.DoEvents,并获得更一致的帧速率。正如所写,您的程序将以尽可能快的速度绘制这10帧,然后将取决于运行它的CPU的速度。实际上,它只是对运动的处理。for循环移动敌人。无论如何,通过添加一个表示帧的计时器,您将能够避免hacky Application.DoEvents,并获得更一致的帧速率。如前所述,您的程序将以最快的速度绘制这10帧,然后将取决于运行它的CPU的速度。