Control.invoke и родительский контроль - PullRequest
3 голосов
/ 27 января 2010

Допустим, у меня есть форма MainForm и элемент управления: somelabel. Чтобы получить доступ к этим элементам управления из другого потока, я должен использовать метод Invoke. например:

somelabel.Invoke(...);

Однако я также могу получить доступ к метке через форму, подобную этой:

MainForm.Invoke(...) //Code for manipulating somelabel

Есть ли разница между этими двумя фрагментами с точки зрения производительности или какого-либо другого технического аспекта?

Ответы [ 2 ]

4 голосов
/ 27 января 2010

Нет. Каждый элемент управления форм Windows предоставляет метод Invoke, и все они функционируют одинаково. Независимо от того, какой элемент управления вы используете (будь то форма или дочерний элемент управления), вы все равно будете выполнять одну и ту же базовую операцию, поэтому производительность будет одинаковой.

Лично я предпочитаю использовать форму вместо отдельных элементов управления. Это облегчает последующую переработку проекта, поскольку вы можете удалять или добавлять элементы управления, не нарушая код, вызываемый через форму. Другим хорошим вариантом является использование WindowsFormsSynchronizationContext , который можно получить с помощью SynchronizationContext.Current . Это дает вам возможность создать контекст синхронизации, который вы можете использовать (через Send / Post вместо Invoke), который делает то же самое, но не привязан к любому элементу управления.

2 голосов
/ 27 января 2010

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

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

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