Разрешение обновлять C # GUI (форму) по таймеру в другом классе - PullRequest
0 голосов
/ 06 апреля 2011

Я пытаюсь создать программу, которая обновляет графический интерфейс с новыми данными каждые 30 секунд. В настоящее время он у меня есть, поэтому вы можете нажать кнопку, чтобы обновить значения данных, но я хочу, чтобы готовый продукт автоматически обновлялся. Я уверен, что это простое дополнение, возможно, с добавлением класса backgroundWorker? Или создайте событие, которое будет обрабатываться так же, как работает слушатель действия buttonClicked. Каков наилучший способ сделать это?

Ответы [ 5 ]

1 голос
/ 06 апреля 2011

Если это приложение Windows Forms, то для этого проще всего использовать компонент Timer. Вы можете указать интервал выполнения и даже обработчик, когда таймер «тикает».

Если вы собираетесь обновить GUI из обработчика событий таймера, вам может потребоваться использовать Application.DoEvents , чтобы окно «перекрасилось». В противном случае вы можете не увидеть никаких изменений в графическом интерфейсе до тех пор, пока не будут обработаны все события. Пожалуйста, прочитайте здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx


Решение, представленное выше, является самым простым способом. Когда вы знакомы с этой концепцией, вы можете расширить свои знания о потоках и обновлении GUI из потоков, которые не создавали GUI и т. Д. Это может быть вам интересно: как обновить графический интерфейс Windows из другого класса?

1 голос
/ 06 апреля 2011

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

0 голосов
/ 06 апреля 2011

Я бы взял SynchronizationContext во время создания формы и сохранил бы его как личное поле.Затем в событии таймера используйте методы указанного поля для вызова кода обновления пользовательского интерфейса в контексте потока пользовательского интерфейса.

Этот метод работает как для Winforms, так и для WPF.

Вам не нужно использовать system.Forms.Timer, вы можете использовать это, чтобы переместить выполнение блока кода в контекст потока пользовательского интерфейса, будь то из System.Timer, ThreadPool, как угодно.Эта Code Project статья объясняет немного больше.

0 голосов
/ 06 апреля 2011

Вы должны учитывать, сколько времени займет получение данных из реального источника данных. Это связано с тем, что если вы используете Winform Timer, во время обработки события таймера пользовательский интерфейс не будет реагировать на другие пользовательские события, поэтому, если это длительный процесс, пользовательский опыт ухудшается. Использование фонового рабочего потока было бы хорошей стратегией, но в этом случае вы должны обновить пользовательский интерфейс через Control.Invoke или с помощью события PreogressChanged. На мой взгляд, второй вариант (BackgroundWorker) лучше.

0 голосов
/ 06 апреля 2011

Вы можете использовать таймер:

System.Forms.Timer

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