Control.InvokeRequired Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает значение, указывающее, должен ли вызывающий метод вызывать метод при вызове метода к элементу управления, так как вызывающий объект находится в другом потоке, отличном от того, в котором был создан элемент управления.
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 управления с помощью метода вызова); в противном случае 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".