Я полагаю, что ваш код находится в одной функции, которая выполняется в основном потоке.По этой причине пользовательский интерфейс не будет обновляться до тех пор, пока ваша функция не вернется.
В этот момент у вас останется любое состояние, которое было последним на момент возврата вашей функции ( именно поэтому вы видите только последнее установленное изображение ).
Также обратите внимание, что, выполняя промежуточную функцию запроса Sleep()
, вы по существу блокируете основнойпоток вашего приложения (или любой другой поток, в котором выполняется ваша функция, но вполне вероятно, что это ваш основной поток).Во время сна ваше приложение не будет просто реагировать ни на что, и ваш пользовательский интерфейс будет зависать.
Вы можете принять решение об аннулировании ваших элементов управления (Control.Refresh()
, Control.Invalidate()
, Control.Update()
, Control.Refresh()
, Application.DoEvents()
) но обычно это хаки, если не используются должным образом.
Использование Timer
- вариант.Хотя, в вашем конкретном случае, просто использование анимированного GIF может быть лучшим решением.
Обратите внимание, что если вы решите использовать таймер , то между System.Windows.Forms.Timer
и другими таймерами будет существенная разница .System.Windows.Forms.Timer
будет запущен в вашем основном потоке в кратчайшие сроки (и поэтому будет безопасно взаимодействовать с элементами управления пользовательским интерфейсом, потому что вы будете делать это из того же потока; но, с другой стороны, он может запускаться с небольшимзадержка).Если вместо этого вы собираетесь использовать другой таймер, вы не сможете получить прямой доступ к элементам управления пользовательского интерфейса без нарушения важного правила.Подробнее об этом здесь: Сравнение классов таймеров в библиотеке классов .NET Framework
См .: Принудительное обновление графического интерфейса из потока пользовательского интерфейса
И: Анимированный Gif в форме с использованием C #