Что такое invoke c
Делегаты, события и лямбды
Делегаты
Определение делегатов
Делегат Message в качестве возвращаемого типа имеет тип void (то есть ничего не возвращает) и не принимает никаких параметров. Это значит, что этот делегат может указывать на любой метод, который не принимает никаких параметров и ничего не возвращает.
Рассмотрим примение этого делегата:
Здесь сначала мы определяем делегат:
В данном случае делегат определяется внутри класса, но также можно определить делегат вне класса внутри пространства имен.
Для использования делегата объявляется переменная этого делегата:
С помощью свойства DateTime.Now.Hour получаем текущий час. И в зависимости от времени в делегат передается адрес определенного метода. Обратите внимание, что методы эти имеют то же возвращаемое значение и тот же набор параметров (в данном случае отсутствие параметров), что и делегат.
Затем через делегат вызываем метод, на который ссылается данный делегат:
Вызов делегата производится подобно вызову метода.
Посмотрим на примере другого делегата:
В данном случае делегат Operation возвращает значение типа int и имеет два параметра типа int. Поэтому этому делегату соответствует любой метод, который возвращает значение типа int и принимает два параметра типа int. В данном случае это методы Add и Multiply. То есть мы можем присвоить переменной делегата любой из этих методов и вызывать.
Делегаты необязательно могут указывать только на методы, которые определены в том же классе, где определена переменная делегата. Это могут быть также методы из других классов и структур.
Присвоение ссылки на метод
Оба способа равноценны.
Соответствие методов делегату
Этому делегату соответствует, например, следующий метод:
А следующие методы НЕ соответствуют:
Здесь метод SomeMethod2 имеет другой возвращаемый тип, отличный от типа делегата. SomeMethod3 имеет другой набор параметров. Параметры SomeMethod4 и SomeMethod5 также отличаются от параметров делегата, поскольку имеют модификаторы ref и out.
Добавление методов в делегат
При добавлении делегатов следует учитывать, что мы можем добавить ссылку на один и тот же метод несколько раз, и в списке вызова делегата тогда будет несколько ссылок на один и то же метод. Соответственно при вызове делегата добавленный метод будет вызываться столько раз, сколько он был добавлен:
При удалении методов из делегата фактически будет создаватья новый делегат, который в списке вызова методов будет содержать на один метод меньше.
Объединение делегатов
Делегаты можно объединять в другие делегаты. Например:
В данном случае объект mes3 представляет объединение делегатов mes1 и mes2. Объединение делегатов значит, что в список вызова делегата mes3 попадут все методы из делегатов mes1 и mes2. И при вызове делегата mes3 все эти методы одновременно будут вызваны.
Вызов делегата
В примерах выше делегат вызывался как обычный метод. Если делегат принимал параметры, то при ее вызове для параметров передавались необходимые значения:
Другой способ вызова делегата представляет метод Invoke() :
Если делегат принимает параметры, то в метод Invoke передаются значения для этих параметров.
Следует учитывать, что если делегат пуст, то есть в его списке вызова нет ссылок ни на один из методов (то есть делегат равен Null), то при вызове такого делегата мы получим исключение, как, например, в следующем случае:
Поэтому при вызове делегата всегда лучше проверять, не равен ли он null. Либо можно использовать метод Invoke и оператор условного null:
Если делегат возвращает некоторое значение, то возвращается значение последнего метода из списка вызова (если в списке вызова несколько методов). Например:
Делегаты как параметры методов
Также делегаты могут быть параметрами методов:
Control. Invoke Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Выполняет делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Перегрузки
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Выполняет указанный делегат в том потоке, которому принадлежит основной дескриптор окна элемента управления, с указанным списком аргументов.
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Invoke(Action)
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Параметры
Делегат, содержащий метод, который требуется вызывать в контексте потока элемента управления.
Применяется к
Invoke(Delegate)
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Параметры
Делегат, содержащий метод, который требуется вызывать в контексте потока элемента управления.
Возвращаемое значение
Примеры
В следующем примере кода показаны элементы управления, которые содержат делегат. Делегат инкапсулирует метод, который добавляет элементы в список, и этот метод выполняется в потоке, владеющем базовым маркером формы. Когда пользователь нажимает кнопку, Invoke запускает делегат.
Комментарии
Делегаты похожи на указатели функций в языках C или C++. Делегаты инкапсулируют ссылку на метод внутри объекта делегата. Затем объект делегата может быть передан в код, вызывающий упоминаемый метод, а вызываемый метод может быть неизвестным во время компиляции. В отличие от указателей функций в C или C++ делегаты являются объектно-ориентированными, строго типизированными и более безопасными.
InvokeМетод выполняет поиск по родительской цепочке элемента управления до тех пор, пока не обнаружит элемент управления или форму, которые имеют обработчик окна, если его базовый маркер окна текущего элемента управления еще не существует. Если не удается найти соответствующий обработчик, Invoke метод вызовет исключение. Исключения, возникающие во время вызова, передаются обратно вызывающему объекту.
Исключение может быть вызвано, если поток, который должен обработать сообщение, больше не активен.
Можете объяснить суть invoke
3 ответа 3
Небольшой пример использования Invoke :
В оконных приложениях Windows существует так называемый поток пользовательского интерфейса (UI thread), по сути — основной поток приложения, создаваемый самым первым.
В WinForms изменение текста в поле ввода выполняется с помощью присваивания:
Но что, если вы вызовете SendMessage из другого потока? Вопреки расхожему мнению, это не приведёт к ошибке. Вы можете это сделать, но вызывающий поток будет остановлен до тех пор, пока SendMessage не завершится. Если в программе работают несколько потоков, и они захотят что-то изменить в пользовательском интерфейсе, они будут приостановлены, и каждый их SendMessage будет выполняться основным потоком последовательно.
А если асинхронные функции начинают ждать друг друга, соответствующие потоки оказываются заняты, и программе, которая заведует пулом потоков, приходится создавать новые.
Это проблема, так что Windows запрещает вызывать SendMessage из других потоков при асинхронных вызовах.
Возникает вопрос, как эту проблему решить. Разработчики Windows предлагают разбить вашу асинхронную функцию на две. Первая делает полезную работу и потом говорит пулу потоков: вызови вот эту вот вторую асинхронную функцию, но сделай это в основном потоке. Вторая функция обновляет индикатор процесса, и, поскольку пул потоков вызывает её в основном потоке, никаких конфликтов не происходит.
Да, обновление интерфейса всё ещё происходит последовательно, но все остальные асинхронные функции совершенно не мешают друг другу.
Использовать их можно, например, так:
Здесь параметр Invoke это анонимный делегат, то есть в действительности функция, которая будет вызвана из потока пользовательского интерфейса.
Есть несколько способов упростить этот код (ищите на Stack Overflow). Отмечу основную идею: код располагается внутри одного из методов вашей формы, соответственно, InvokeRequired и Invoke это свойство и метод формы.
Вызывать изменение свойств через Invoke нужно только в том случае, когда свойство InvokeRequired истинно. Перед вызовом полезно подготовить все данные, которые вам потребуется использовать, чтобы не тормозить поток пользовательского интерфейса. Сначала готовите данные, а потом присваиваете их через свойства элементов управления внутри Invoke / BeginInvoke — таков основной паттерн асинхронного программирования десктопных приложений.
Method Base. Invoke Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
Вызывает метод или конструктор, представленный текущим экземпляром, используя указанные параметры.
При переопределении в производном классе вызывает отражаемый метод или конструктор с заданными параметрами.
Invoke(Object, Object[])
Вызывает метод или конструктор, представленный текущим экземпляром, используя указанные параметры.
Параметры
Объект, для которого нужно вызвать метод или конструктор. Если метод является статическим, этот аргумент игнорируется. Если конструктор является статическим, этот аргумент должен иметь значение null или представлять экземпляр класса, который определяет конструктор.
Возвращаемое значение
Объект, который содержит возвращаемое значение вызываемого метода, или null при вызове конструктора.
Реализации
Исключения
Параметр obj имеет значение null и метод не является статическим.
-или- Вызывается статический конструктор, а obj не имеет значения null и не является экземпляром класса, в котором объявлен этот конструктор.
Элементы массива parameters не соответствуют подписи метода или конструктора, отраженного этим экземпляром.
Вызванный метод или конструктор создает исключение.
-или- Текущий экземпляр представляет DynamicMethod, который содержит непроверяемый код. См. подраздел «Проверка» в разделе примечаний для DynamicMethod.
Массив parameters содержит неправильное число аргументов.
Вызывающий объект не имеет разрешение на выполнение метода или конструктора, представленного текущим экземпляром.
Текущий экземпляр представляет MethodBuilder.
Примеры
В следующем примере кода демонстрируется динамический поиск метода с помощью отражения. Обратите внимание, что нельзя использовать MethodInfo объект из базового класса для вызова переопределенного метода в производном классе, так как позднее связывание не может разрешить переопределения.
Комментарии
Если вызванный метод создает исключение, Exception.GetBaseException метод возвращает исключение.
См. также раздел
Применяется к
Invoke(Object, BindingFlags, Binder, Object[], CultureInfo)
При переопределении в производном классе вызывает отражаемый метод или конструктор с заданными параметрами.
Параметры
Объект, для которого нужно вызвать метод или конструктор. Если метод является статическим, этот аргумент игнорируется. Если конструктор является статическим, этот аргумент должен иметь значение null или представлять экземпляр класса, который определяет конструктор.
Возвращаемое значение
Реализации
Исключения
Параметр obj имеет значение null и метод не является статическим.
-или- Вызывается статический конструктор, а obj не имеет значения null и не является экземпляром класса, в котором объявлен этот конструктор.
Тип параметра parameters не соответствует подписи метода или конструктора, отраженного этим экземпляром.
Массив parameters содержит неправильное число аргументов.
Вызванный метод или конструктор создает исключение.
Вызывающий объект не имеет разрешение на выполнение метода или конструктора, представленного текущим экземпляром.
Примеры
Комментарии
Для примитивных параметров передачи по значению выполняется нормальное расширяющее значение (например, Int16-> Int32). Для ссылочных параметров передачи по значению допустимо расширение обычной ссылки (производный класс от базового класса, а базовый класс — тип интерфейса). Однако для параметров-примитивов, передаваемых по ссылке, типы должны точно совпадать. Для ссылочных параметров передачи по ссылке нормальное расширение по-прежнему применяется.
При вызове виртуальных методов отражение использует динамический поиск метода. Например, предположим, что класс B наследует от класса а и оба реализуют виртуальный метод с именем M. Теперь предположим, что у вас есть MethodInfo объект, представляющий M для класса a. При использовании Invoke метода для вызова M для объекта типа b, отражение будет использовать реализацию, заданную классом b. Даже если объект типа B приводится к типу, используется реализация, заданная классом B (см. пример кода ниже).
С другой стороны, если метод не является виртуальным, отражение будет использовать реализацию, заданную типом, от которого MethodInfo получен объект, независимо от типа объекта, переданного в качестве целевого объекта.
Ограничения доступа игнорируются для полностью доверенного кода. Таким образом, закрытые конструкторы, методы, поля и свойства могут быть доступны и вызваны через отражение всякий раз, когда код является полностью доверенным.
Dispatcher. Invoke Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Выполняет заданный делегат синхронно, в потоке, с которым связан Dispatcher.
Перегрузки
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументом, в потоке, с которым связан Dispatcher.
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Выполняет указанный объект Action синхронно с заданным приоритетом в потоке, с которым связан Dispatcher.
Выполняет указанный делегат асинхронно, с заданными приоритетом и значением таймаута, в потоке, в котором был создан объект Dispatcher.
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументом, в потоке, с которым связан Dispatcher.
Выполняет указанный делегат в течение заданного промежутка времени, синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Выполняет указанный делегат в течение заданного промежутка времени, синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Выполняет указанный объект Action синхронно с заданным приоритетом в потоке, с которым связан Dispatcher.
Выполняет указанный делегат в синхронном режиме по заданному приоритету в потоке, Dispatcher с которым связан объект.
Выполняет указанный делегат синхронно с заданными аргументами в потоке, с которым связан объект Dispatcher.
Выполняет указанный объект Action синхронно с заданным приоритетом в потоке, с которым связан Dispatcher.
Выполняет заданный объект Action синхронно в потоке, с которым связан Dispatcher.
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Примеры
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Invoke(DispatcherPriority, TimeSpan, Delegate, Object, Object[])
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Параметры
Приоритет относительно других ожидающих операций в Dispatcher очереди событий, с которыми вызывается указанный метод.
Делегат метода с несколькими аргументами, помещенный в очередь событий Dispatcher.
Объект, передаваемый в качестве аргумента указанному методу.
Массив объектов, передаваемых в качестве аргументов указанному методу.
Возвращаемое значение
Исключения
priority не является допустимым DispatcherPriority.
timeout отрицательное число, отличное от-1, и этот метод был вызван в потоках.
Комментарии
arg может быть, null Если аргумент не требуется.
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(DispatcherPriority, TimeSpan, Delegate, Object)
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументом, в потоке, с которым связан Dispatcher.
Параметры
Приоритет относительно других ожидающих операций в Dispatcher очереди событий, с которыми вызывается указанный метод.
Делегат метода с несколькими аргументами, помещенный в очередь событий Dispatcher.
Возвращаемое значение
Исключения
priority не является допустимым приоритетом.
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(DispatcherPriority, Delegate, Object, Object[])
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Параметры
Приоритет относительно других ожидающих операций в Dispatcher очереди событий, с которыми вызывается указанный метод.
Делегат метода с несколькими аргументами, помещенный в очередь событий Dispatcher.
Объект, передаваемый в качестве аргумента указанному методу.
Массив объектов, передаваемых в качестве аргументов указанному методу.
Возвращаемое значение
Исключения
priority не является допустимым приоритетом.
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(Action, DispatcherPriority, CancellationToken, TimeSpan)
Выполняет указанный объект Action синхронно с заданным приоритетом в потоке, с которым связан Dispatcher.
Параметры
Делегат действия для вызова через Dispatcher.
Объект, указывающий, следует ли отменить действие.
Исключения
timeout отрицательное число, отличное от-1, и этот метод был вызван в потоках.
priority не является допустимым приоритетом.
Применяется к
Invoke(DispatcherPriority, TimeSpan, Delegate)
Выполняет указанный делегат асинхронно, с заданными приоритетом и значением таймаута, в потоке, в котором был создан объект Dispatcher.
Параметры
Приоритет относительно других ожидающих операций в Dispatcher очереди событий, с которыми вызывается указанный метод.
Делегат метода без аргументов, помещенный в очередь событий Dispatcher.
Возвращаемое значение
Исключения
timeout отрицательное число, отличное от-1, и этот метод был вызван в потоках.
priority не является допустимым приоритетом.
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(DispatcherPriority, Delegate, Object)
Выполняет указанный делегат синхронно, с заданными приоритетом и аргументом, в потоке, с которым связан Dispatcher.
Параметры
Приоритет относительно других ожидающих операций в Dispatcher очереди событий, с которыми вызывается указанный метод.
Делегат метода с одним аргументом, помещенный в очередь событий Dispatcher.
Объект, передаваемый в качестве аргумента указанному методу.
Возвращаемое значение
Исключения
priority не является допустимым приоритетом.
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(Delegate, TimeSpan, DispatcherPriority, Object[])
Выполняет указанный делегат в течение заданного промежутка времени, синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Параметры
Приоритет относительно других ожидающих операций в Dispatcher очереди событий, с которыми вызывается указанный метод.
Возвращаемое значение
Исключения
timeout отрицательное число, отличное от-1, и этот метод был вызван в потоках.
priority не является допустимым приоритетом.
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(Delegate, TimeSpan, Object[])
Выполняет указанный делегат в течение заданного промежутка времени, синхронно, с заданными приоритетом и аргументами, в потоке, с которым связан Dispatcher.
Параметры
Возвращаемое значение
Исключения
timeout является отрицательным числом, отличным от-1, и вызывается между потоками.
Комментарии
Invoke является синхронной операцией; Поэтому Управление не возвращается вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(Action, DispatcherPriority, CancellationToken)
Выполняет указанный объект Action синхронно с заданным приоритетом в потоке, с которым связан Dispatcher.
Параметры
Делегат, вызываемый с помощью диспетчера.
Объект, указывающий, следует ли отменить действие.
Применяется к
Invoke(DispatcherPriority, Delegate)
Выполняет указанный делегат в синхронном режиме по заданному приоритету в потоке, Dispatcher с которым связан объект.
Параметры
Приоритет, с которым вызывается указанный метод, относительно других ожидающих операций в Dispatcher очереди событий.
Делегат метода без аргументов, помещенный в очередь событий Dispatcher.
Возвращаемое значение
Исключения
priority не является допустимым приоритетом.
Примеры
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.
Применяется к
Invoke(Delegate, Object[])
Выполняет указанный делегат синхронно с заданными аргументами в потоке, с которым связан объект Dispatcher.
Параметры
Возвращаемое значение
Комментарии
Invoke является синхронной операцией; Поэтому Управление не вернется к вызывающему объекту до тех пор, пока не будет возвращен обратный вызов.