Загрузка нового изображения каждую секунду - PullRequest
2 голосов
/ 03 мая 2011

Мне нужно каждую секунду (или две) загружать новое изображение.

Следующий код не работает:

System.Threading.Thread.Sleep(2000);
this.Image_LoadImage.Source = new BitmapImage(new Uri(@"D:\\connect2-1.gif"));
System.Threading.Thread.Sleep(2000);
this.Image_LoadImage.Source = new BitmapImage(new Uri(@"D:\\connect3-1.gif"));

Я вижу, что приложение спит 4 секунды, а затем появляется второе изображение.

Как я могу это сделатьЭто?Спасибо.

Ответы [ 4 ]

5 голосов
/ 03 мая 2011

Используйте таймер для этого

    private System.Threading.Timer timer;
    public MainWindow()
    {
        InitializeComponent();
        timer = new System.Threading.Timer(OnTimerEllapsed, new object(), 0, 2000);
    }

    private void OnTimerEllapsed(object state)
    {
        if (!this.Dispatcher.CheckAccess())
        {
            this.Dispatcher.Invoke(new Action(LoadImages));
        }
    }

    private bool switcher;
    private void LoadImages()
    {
        string stringUri = switcher ? @"D:\\connect2-1.gif" :
                                      @"D:\\connect3-1.gif";
        this.Image_LoadImage.Source = new BitmapImage(new Uri(stringUri));

        switcher = !switcher;
    }
5 голосов
/ 03 мая 2011

Используйте таймер.

Вызов потока сна блокирует поток пользовательского интерфейса. Нашел ссылку для вас:

3 голосов
/ 03 мая 2011

Я полагаю, что ваш код находится в одной функции, которая выполняется в основном потоке.По этой причине пользовательский интерфейс не будет обновляться до тех пор, пока ваша функция не вернется.

В этот момент у вас останется любое состояние, которое было последним на момент возврата вашей функции ( именно поэтому вы видите только последнее установленное изображение ).

Также обратите внимание, что, выполняя промежуточную функцию запроса 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 #

0 голосов
/ 03 мая 2011

Попробуйте обновить () ваш элемент управления после изменения его источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...