Skip to content

Як оновити графічний інтерфейс з іншого потоку?

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Завантаження...

[ Полезный рекламный блок ]

Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.


У C# Windows Forms існує кілька способів оновлення графічного інтерфейсу з іншого потоку. Розглянемо два найпоширеніші підходи.

Використання методу Invoke()

Метод Invoke() дає змогу виконати делегат (метод) у контексті потоку, в якому було створено об’єкт керуючого елемента (control). Для того щоб оновити графічний інтерфейс з іншого потоку, необхідно створити делегат, який міститиме код, що виконує необхідні зміни інтерфейсу, і потім викликати метод Invoke() на об’єкті керуючого елемента, передавши йому створений делегат як параметр:

Розглянемо ще один простий приклад:

Під час натискання на кнопку ‘button1’, відбувається асинхронне циклічне присвоювання інкримінованого значення в ‘label1’, із затримкою в 1 секунду.

 

Використання методу BeginInvoke()

Метод BeginInvoke() дозволяє виконати делегат асинхронно, тобто не блокуючи головний потік. Цей метод повертає об’єкт типу IAsyncResult, який можна використовувати для перевірки статусу виконання асинхронної операції:

У цьому прикладі метод UpdateTextBox() викликається з аргументом text. Якщо виклик відбувається з іншого потоку, то метод BeginInvoke() використовується для виконання делегата в контексті потоку, в якому було створено об’єкт керуючого елемента (control). Якщо виклик відбувається з того ж потоку, що й керуючий елемент, то метод виконує безпосередньо код у блоці else.

У метод BeginInvoke() передається делегат, який містить метод UpdateTextBox() і його аргументи. У цьому прикладі використовується лямбда-вираз для створення делегата:

Зверніть увагу, що перед викликом методу BeginInvoke() слід перевірити властивість InvokeRequired у керуючого елемента, щоб переконатися, що виклик відбувається з іншого потоку:

Важливо пам’ятати, що під час використання методу BeginInvoke() слід забезпечити захист доступу до загальних даних, які можуть бути змінені з різних потоків, наприклад, за допомогою блокування (lock).

Я сподіваюся, що вам сподобалося читати цю статтю, і вона виявилася легкою для розуміння. Будь ласка, дайте мені знати, якщо у вас є якісь коментарі або виправлення.

Так само вам може бути цікава попередня стаття – Як зберегти зображення з Picturebox.

Ви хочете навчитися писати код мовою програмування C#?

Створювати різні інформаційні системи, що складаються з сайтів, мобільних клієнтів, десктопних додатків, телеграм-ботів тощо.

Переходьте до нас на сторінку Dijix і ознайомтеся з умовами навчання, ми спеціалізуємося тільки на індивідуальних заняттях, як для початківців, так і для просунутих програмістів. Ви можете взяти як одне заняття для опрацювання питання, що вас цікавить, так і кілька, для більш щільної роботи. Завдяки особистому кабінету, кожен студент підвищить якість свого навчання, у вашому розпорядженні:

  • Доступ до пройденого матеріалу
  • Тематичні статті
  • Бібліотека книг
  • Онлайн тестування
  • Спілкування в закритих групах

https://dijix.com.ua

Живи у своєму світі, програмуй у нашому.

Published inВідповіді на запитання C#
Subscribe
Notify of
guest
0 комментариев
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x