Control.InvokeRequired 속성

정의

호출자가 컨트롤이 만들어진 스레드와 다른 스레드에 있기 때문에 메서드를 통해 컨트롤을 호출하는 경우 해당 호출자가 호출 메서드를 호출해야 하는지를 나타내는 값을 가져옵니다.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이고, 그렇지 않으면 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. 이 속성은 호출 메서드를 호출 해야 하는지 여부를 확인 하는 데 사용할 수 있습니다 .이 메서드는 컨트롤을 소유 하 고 있는 스레드를 알 수 없는 경우에 유용할 수 있습니다.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, EndInvokeCreateGraphics를 호출 하는 것을 스레드로부터 안전 하 게 제어 하는 네 가지 메서드가 있습니다.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.

즉, Invoke 필요 하지 않은 경우 (호출이 동일한 스레드에서 발생 하는 경우) 또는 컨트롤이 다른 스레드에서 만들어졌지만 컨트롤의 핸들이 아직 생성 되지 않은 경우 InvokeRequired false를 반환할 수 있습니다.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.

InvokeRequired가 백그라운드 스레드에서 false 반환 하는 경우에도 IsHandleCreated의 값을 확인 하 여이 경우 보호할 수 있습니다.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.

참고

메시지를 처리 해야 하는 스레드가 더 이상 활성화 되어 있지 않으면 예외가 throw 될 수 있습니다.An exception might be thrown if the thread that should process the message is no longer active.

다중 스레드 Windows Forms 컨트롤에 대 한 자세한 내용은 How to: 백그라운드 스레드를 사용 하 여 파일을 검색 하 고 방법을 합니다. 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.

적용 대상

추가 정보