Фундаментальный вопрос о синхронизации с потоком пользовательского интерфейса в Winforms с использованием c# - PullRequest
0 голосов
/ 17 июня 2020

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

У меня вопрос, если то, что вы делаете, не меняет Посмотрите на какой-либо элемент управления, будет ли он по-прежнему обращаться к потоку пользовательского интерфейса?

Например, в моей form1 есть регистратор, который записывает сообщения в локальный файл, который пользователи вообще не видят. Если я использую регистратор в другом потоке, скажем, напишу новое сообщение, будет ли это считаться доступом к потоку пользовательского интерфейса? Да, логгер инициализируется в form1.cs, но он не имеет визуального представления в форме вообще. Мне все еще нужно использовать invoke?

Кроме того, если у меня есть настраиваемый элемент управления, расширяющий текстовое поле. У настраиваемого элемента управления есть свойство, называемое инициализированным. Изменение этого свойства никак не влияет на внешний вид элемента управления. Затем, если я обновлю это свойство из другого потока, нужно ли мне использовать метод invoke?

Ответы [ 2 ]

0 голосов
/ 16 августа 2020

Простой эксперимент, кажется, говорит, что если вы не меняете внешний вид элемента управления, значит, вы поточно-ориентированы.

введите описание изображения здесь

На скриншоте видно, что когда я установил член моей формы call blnButtonDown (bool), все было нормально. Когда я изменил имя текстового поля моей формы, все было в порядке. Только когда я изменил текст текстового поля, который меняет внешний вид формы, я получил исключение.

Итак, мой предварительный вывод состоит в том, что если вы меняете форму / элемент управления из другого потока, вы не нужно использовать invoke, если ваши изменения не меняют внешний вид формы / элемента управления.

0 голосов
/ 17 июня 2020

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

То же самое и с последним вопросом.

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