Почему кто-то хочет использовать Invoke () (не BeginInvoke ())? - PullRequest
1 голос
/ 15 октября 2010

Мне сказали, что Invoke () похож на обычный вызов метода ... так почему люди решили использовать Invoke, а не обычный вызов метода?

Я пытался найти в Интернете проблему, которую я получил, это преимущества использования BeginInvoke (), но каковы преимущества использования Invoke ()?

Ответы [ 5 ]

5 голосов
/ 15 октября 2010

Используйте BeginInvoke, если вы хотите вызвать делегат асинхронно (в потоке, взятом из пула потоков), и Invoke, если вы хотите вызвать его синхронно.

3 голосов
/ 15 октября 2010

Стоит сначала отметить, что у нас должно быть что-то вроде .Invoke() в качестве места встречи между языками. То же самое, что int для C # и Integer для VB.NET равно System.Int32 для них обоих и для любого другого языка CLR; так же у нас есть Invoke(), к которому любой язык CLR может предложить доступ, и который они затем могут предоставить дополнительный синтаксический сахар в средствах, подходящих для их синтаксиса (большинство из них будут рассматривать в значительной степени соглашения о стиле VB в C # или соглашения о стиле C # в VB быть синтаксическим уксусом; сахар всегда должен соответствовать остальному языку как можно лучше).

Этот сахар добавлен, почему бы не использовать его постоянно? Некоторые люди иногда хотят прояснить, что они имеют дело с делегатом. Некоторые просто не будут его использовать; Я в основном нет. Как и у всех синтаксических символов, преимущества и недостатки связаны с ясностью, а не с правильностью (действительно, посмотрите на вызов x.Invoke() в отражателе, и вы увидите, что он x(), потому что отражатель не знает, какой вы использовали) .

3 голосов
/ 15 октября 2010

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

0 голосов
/ 15 октября 2010

Полагаю, вы уже понимаете, что такое делегат, для чего и почему он полезен.

Если у меня есть deletegate с именем «MyDelegate», я могу сделать «MyDelegate(foo);» или «MyDelegate.Invoke(foo);», но я всегда использую второй, чтобы я мог легко видеть при просмотре кода, что на самом деле делегат а не метод. Внутренней разницы нет.

0 голосов
/ 15 октября 2010

Для того, чтобы изменить, например, поток, выполняющий что-либо.

Обратите внимание, что любой элемент управления пользовательского интерфейса должен и всегда может управляться только из потока, который его создал (фактически, насос сообщений).Таким образом, если другой поток манипулирует элементом управления (синхронно с точки зрения других потоков), тогда BeginInvoke будет дополнительными накладными расходами, но Invoke в порядке (ОСОБЕННО, потому что, по крайней мере, в WPF есть ярлык для нескольких последовательностей вызова, которые делают его быстрее).выполнить внутренне).

...