Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Property

Определение

Возвращает значение, указывающее, следует ли вызывающему оператору обращаться к методу invoke во время вызовов метода из элемента управления, так как вызывающий оператор находится не в том потоке, в котором был создан элемент управления.Gets a value indicating whether the caller must call an invoke method when making method calls to the control because the caller is on a different thread than the one the control was created on.

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

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

Значение true, если свойство Handle элемента управления было создано не в вызывающем потоке, а в другом (показывает, что необходимо вызвать элемент управления через метод invoke); в противном случае — значение false.true if the control's Handle was created on a different thread than the calling thread (indicating that you must make calls to the control through an invoke method); otherwise, false.

Реализации

Комментарии

Элементы управления в Windows Forms привязаны к конкретному потоку и не являются потокобезопасными.Controls in Windows Forms are bound to a specific thread and are not thread safe. Таким образом, при вызове метода элемента управления из другого потока, необходимо использовать один из методов, чтобы маршалировать вызов в нужный поток invoke элемента управления.Therefore, if you are calling a control's method from a different thread, you must use one of the control's invoke methods to marshal the call to the proper thread. Это свойство можно использовать для определения того, если необходимо вызвать метод invoke, что может оказаться полезным в том случае, если вы не знаете, какой поток является владельцем элемента управления.This property can be used to determine if you must call an invoke method, which can be useful if you do not know what thread owns a control.

Примечание

В дополнение к InvokeRequired свойство, существует четыре метода в элементе управления, которые являются потокобезопасными для вызова: Invoke,BeginInvoke, EndInvoke и CreateGraphics Если уже был создан дескриптор для элемента управления.In addition to the InvokeRequired property, there are four methods on a control that are thread safe to call: Invoke,BeginInvoke, EndInvoke and CreateGraphics if the handle for the control has already been created. Вызов CreateGraphics до создания дескриптора элемента управления в фоновом потоке может привести к недопустимый кросс-поток вызывает метод.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Для всех других вызовов методов, следует использовать один из этих вызова методов, при вызове из другого потока.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Если дескриптор элемента управления еще не существует, InvokeRequired поиск вверх цепочки родительского элемента управления, пока не найдет элемента управления или формы, которая имеет дескриптор окна.If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. Если найден соответствующий дескриптор, InvokeRequired возвращает метод false.If no appropriate handle can be found, the InvokeRequired method returns false.

Это означает, что InvokeRequired может возвращать false Если Invoke не является обязательным (вызов происходит в одном потоке), или если элемент управления был создан в другом потоке, но дескриптор элемента управления еще не был создан.This means that InvokeRequired can return false if Invoke is not required (the call occurs on the same thread), or if the control was created on a different thread but the control's handle has not yet been created.

В случае, когда дескриптор элемента управления еще не был создан не следует вызывать просто свойства, методы или события в элементе управления.In the case where the control's handle has not yet been created, you should not simply call properties, methods, or events on the control. Это может привести к дескриптор элемента управления, создаваемого в фоновом потоке, изолируя элемент управления в потоке без механизма обработки сообщений и сделать его нестабильной.This might cause the control's handle to be created on the background thread, isolating the control on a thread without a message pump and making the application unstable.

Обеспечивает защиту от этого случая, также проверив значение IsHandleCreated при InvokeRequired возвращает false в фоновом потоке.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Если дескриптор элемента управления еще не создана, дождитесь, пока он будет создан перед вызовом Invoke или BeginInvoke.If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. Как правило, это происходит только в том случае, если фоновый поток создается в конструкторе основной формы приложения (как в Application.Run(new MainForm()), прежде чем формы или Application.Run был вызван.Typically, this happens only if a background thread is created in the constructor of the primary form for the application (as in Application.Run(new MainForm()), before the form has been shown or Application.Run has been called.

Одно из решений — Подождите, пока не создан дескриптор формы, прежде чем выполнять в фоновом потоке.One solution is to wait until the form's handle has been created before starting the background thread. Либо принудительно создать дескриптор, вызвав Handle свойства или подождать, пока Load событием, чтобы запустить фоновый процесс.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Лучшее решение — использовать SynchronizationContext возвращаемые SynchronizationContext вместо того, чтобы элемент управления для маршалинга между потоками.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Примечание

Может быть создано исключение, если поток, который должен обработать сообщение больше не активна.An exception might be thrown if the thread that should process the message is no longer active.

Дополнительные сведения о многопоточных элементов управления Windows Forms, см. в разделе как: Используйте фоновый поток для поиска файлов и как: Сделать потокобезопасных вызовов элементов управления Windows Forms.For more information about multithreaded Windows Forms controls, see How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.

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

Дополнительно