Control.InvokeRequired Свойство

Определение

Возвращает значение, указывающее, следует ли вызывающему оператору обращаться к методу invoke во время вызовов метода из элемента управления, так как вызывающий оператор находится не в том потоке, в котором был создан элемент управления.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

Значение свойства

Значение true, если свойство Handle элемента управления было создано не в вызывающем потоке, а в другом (показывает, что необходимо вызвать элемент управления через метод invoke); в противном случае — значение false.

Реализации

Атрибуты

Комментарии

Элементы управления в Windows Forms привязаны к определенному потоку и не являются потокобезопасными. Поэтому при вызове метода элемента управления из другого потока необходимо использовать один из методов вызова элемента управления, чтобы маршалировать вызов к соответствующему потоку. Это свойство можно использовать для определения необходимости вызова метода вызова, что может быть полезно, если вы не знаете, какой поток владеет элементом управления.

Примечание

В дополнение к свойству InvokeRequired в элементе управления есть четыре метода, которые являются потокобезопасны для вызова: Invoke,BeginInvokeEndInvoke и CreateGraphics , если дескриптор для элемента управления уже создан. Вызов CreateGraphics до создания дескриптора элемента управления в фоновом потоке может привести к незаконным вызовам между потоками. Для всех других вызовов методов следует использовать один из этих методов вызова при вызове из другого потока.

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

Это означает, что InvokeRequired может возвращать false , если Invoke не требуется (вызов выполняется в том же потоке) или если элемент управления был создан в другом потоке, но дескриптор элемента управления еще не создан.

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

Вы можете защититься от этого случая, также проверив IsHandleCreated значение , когда InvokeRequired возвращается false в фоновом потоке. Если дескриптор элемента управления еще не создан, необходимо подождать, пока он не будет создан, прежде чем вызывать Invoke или BeginInvoke. Как правило, это происходит только в том случае, если фоновый поток создается в конструкторе основной формы для приложения (как в Application.Run(new MainForm()), до отображения или Application.Run вызова формы).

Одним из решений является ожидание создания дескриптора формы перед запуском фонового потока. Принудительная обработка создания путем вызова Handle свойства или ожидание Load , пока событие не запустит фоновый процесс.

Еще более лучшим решением является использование возвращаемого SynchronizationContextSynchronizationContext , а не элемента управления для маршалинга между потоками.

Примечание

Если поток, который должен обрабатывать сообщение, больше не активен, может возникнуть исключение.

Дополнительные сведения о многопоточных элементах управления Windows Forms см. в разделах Практическое руководство. Использование фонового потока для поиска файлов и Практическое руководство. Выполнение Thread-Safe вызовов элементов управления Windows Forms.

Применяется к

См. также раздел