다음을 통해 공유


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 4 개의 메서드를 호출 InvokeBeginInvoke하는 스레드 안전 하는 컨트롤에 있습니다., EndInvokeCreateGraphics 컨트롤에 대 한 핸들을 이미 만든 경우. 백그라운드 스레드에서 컨트롤의 핸들을 만들기 전에 를 호출 CreateGraphics 하면 잘못된 스레드 간 호출이 발생할 수 있습니다. 다른 모든 메서드 호출의 경우 다른 스레드에서 호출할 때 이러한 호출 메서드 중 하나를 사용해야 합니다.

컨트롤의 핸들이 아직 없는 InvokeRequired 경우 창 핸들이 있는 컨트롤 또는 폼을 발견할 때까지 컨트롤의 부모 체인을 검색합니다. 적절한 핸들을 찾을 수 없는 경우 메서드는 를 InvokeRequired 반환합니다 false.

InvokeRequired, 가 필요하지 않거나(동일한 스레드에서 호출이 발생) 컨트롤이 다른 스레드에서 만들어졌지만 컨트롤의 핸들이 아직 만들어지지 않은 경우 Invoke 를 반환 false 할 수 있습니다.

컨트롤의 핸들이 아직 만들어지지 않은 경우 컨트롤에서 속성, 메서드 또는 이벤트를 호출하면 안 됩니다. 메시지 펌프 없이 스레드에서 컨트롤을 격리하고 애플리케이션이 불안정 백그라운드 스레드에서 만들어질 컨트롤의 핸들이 발생할 수 있습니다.

백그라운드 스레드에서 반환 false 되는 경우 InvokeRequired 값을 IsHandleCreated 확인하여 이 사례로부터 보호할 수 있습니다. 컨트롤 핸들이 아직 만들어지지 않은 경우 또는 BeginInvoke를 호출 Invoke 하기 전에 컨트롤 핸들이 만들어질 때까지 기다려야 합니다. 일반적으로 이런 백그라운드 스레드 애플리케이션에 대 한 기본 폼의 생성자에서 만들어진 경우에 (에서처럼 Application.Run(new MainForm())는 폼이 표시 되기 전에, 또는 Application.Run 가 호출 되었습니다.

한 가지 해결 방법은 백그라운드 스레드를 시작하기 전에 폼의 핸들이 생성될 때까지 기다리는 것입니다. 속성을 호출하여 강제로 만들기를 Handle 처리하거나 이벤트가 백그라운드 프로세스를 시작할 때까지 Load 기다립니다.

더 나은 솔루션은 스레드 간 마샬링을 위한 컨트롤이 아닌 에서 반환된 SynchronizationContext 를 사용하는 SynchronizationContext 것입니다.

참고

메시지를 처리해야 하는 스레드가 더 이상 활성 상태가 아니면 예외가 throw될 수 있습니다.

다중 스레드 Windows Forms 컨트롤에 대한 자세한 내용은 방법: 백그라운드 스레드를 사용하여 파일 검색방법: Windows Forms 컨트롤에 대한 Thread-Safe 호출을 참조하세요.

적용 대상

추가 정보