none
Не изменяется текст кнопки RRS feed

  • Вопрос

  • Здравствуйте!

    Раньше работал только с консольными приложениями, не могу понять почему не работает этот код

     

    по коду каждую секунду должен сменятся текст кнопки на Обновить(9) - Обновить(8) - Обновить(7) ...., но почему то, приложение ждет 10 секунд, ничего не меняет и просто пишет Обновить(конечное слово на кнопке)

    for (int z = 0; z <= 10; z++)
          {
            update_button.Content = "Обновить(" + (10 - z) + ")";
            if (z == 10)
            {
              update_button.Content = "Обновить";
              update_button.IsEnabled = true;
              break;
            }
            Thread.Sleep(1000);
          }

    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:03 MSDN Forums Consolidation (От:Технологии .NET Framework: ADO.NET, WCF, WPF etc)
    22 июля 2010 г. 15:59

Ответы

  • Делай ожидание в другом потоке.

          Thread t = new Thread
            (
              delegate()
              {
                for (int i = 10; i > 0; i--)
                {
                  Thread.Sleep(1000);
                  this.Invoke(new MethodInvoker (delegate() { button2.Text = "Обновить " + i.ToString(); }));            
                }
              }
            );
          t.Start();
    

    • Предложено в качестве ответа ulcerModerator 2 августа 2010 г. 5:59
    • Помечено в качестве ответа I.Vorontsov 24 августа 2010 г. 9:45
    22 июля 2010 г. 18:01
    Модератор

Все ответы

  • Делай ожидание в другом потоке.

          Thread t = new Thread
            (
              delegate()
              {
                for (int i = 10; i > 0; i--)
                {
                  Thread.Sleep(1000);
                  this.Invoke(new MethodInvoker (delegate() { button2.Text = "Обновить " + i.ToString(); }));            
                }
              }
            );
          t.Start();
    

    • Предложено в качестве ответа ulcerModerator 2 августа 2010 г. 5:59
    • Помечено в качестве ответа I.Vorontsov 24 августа 2010 г. 9:45
    22 июля 2010 г. 18:01
    Модератор
  • Встречался с таким сам. Графическая программа работает по событиям. Консольная - последовательно. В этом принципиальная разница. События отрабатывает оконная процедура, которая по очереди получает события из очереди приложения (это смотрите WinAPI, если копать будете). Тот код, что Вы дали тоже отрабатывается по какому-то событию (наверняка по команде меню или кнопки). Когда он полностью отработает будет отработано событие для отрисовки окна.

    Есть и другой вариант - метод Update у элементов управления. Он заставляет принудительно перерисоваться не дожидаясь события.

    Но все равно это работает не очень. Кнопка то перерисуется, а окно в целом - нет. Update на окне в целом тоже работает по-разному. Смотря что на форме лежит. Лучше ресурсоемкие процедуры выполнять в отдельном потоке. Для типовых задач есть специальный класс в .Net - System.ComponentModel.BackgroundWorker .

    9 августа 2010 г. 1:18