Control.InvokeRequired 속성
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
호출자가 컨트롤을 만든 스레드와 다른 스레드에 있으므로 호출자가 컨트롤에 메서드를 호출할 때 호출자가 호출 메서드를 호출해야 하는지 여부를 나타내는 값을 가져옵니다.
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 경우 창 핸들이 있는 컨트롤 또는 폼을 찾을 때까지 컨트롤의 부모 체인을 검색합니다. 적절한 핸들을 찾을 수 없으면 메서드가 InvokeRequired 반환됩니다 false.
즉InvokeRequired, 필요하지 않은 경우Invoke(동일한 스레드에서 호출이 발생함) 또는 컨트롤이 다른 스레드에서 만들어졌지만 컨트롤의 핸들이 아직 만들어지지 않은 경우 반환 false 할 수 있습니다.
컨트롤의 핸들이 아직 만들어지지 않은 경우 컨트롤의 속성, 메서드 또는 이벤트를 호출하면 안 됩니다. 이로 인해 컨트롤의 핸들이 백그라운드 스레드에 만들어지고 메시지 펌프 없이 스레드에서 컨트롤을 격리하고 애플리케이션이 불안정해질 수 있습니다.
백그라운드 스레드에서 반환 false 되는 시점 InvokeRequired 의 IsHandleCreated 값을 확인하여 이 사례로부터 보호할 수 있습니다. 컨트롤 핸들이 아직 만들어지지 않은 경우 호출하거나 BeginInvoke호출 Invoke 하기 전에 컨트롤 핸들이 생성될 때까지 기다려야 합니다. 일반적으로 이 문제는 양식이 표시되거나 Application.Run 호출되기 전과 같이 애플리케이션에 대한 기본 폼의 생성자에서 Application.Run(new MainForm())백그라운드 스레드가 만들어지는 경우에만 발생합니다.
한 가지 해결 방법은 백그라운드 스레드를 시작하기 전에 폼의 핸들이 생성될 때까지 기다리는 것입니다. 속성을 호출하여 생성을 Handle 강제로 처리하거나 이벤트가 백그라운드 프로세스를 시작할 때까지 Load 기다립니다.
더 나은 솔루션은 스레드 간 마샬링에 대한 컨트롤보다는 반환된 SynchronizationContext 항목을 사용하는 SynchronizationContext 것입니다.
메모
메시지를 처리해야 하는 스레드가 더 이상 활성 상태가 아니면 예외가 throw될 수 있습니다.
다중 스레드 Windows Forms 컨트롤에 대한 자세한 내용은 방법: 백그라운드 스레드를 사용하여 파일 검색 및 방법: Windows Forms 컨트롤에 대한 Thread-Safe 호출을 참조하세요.