2010-01-27 4 views
3

MainForm 및 컨트롤에 대한 폼이 있다고 가정 해 보겠습니다. somelabel. 다른 스레드에서 이러한 컨트롤에 액세스하려면 Invoke 메서드를 사용해야합니다. 예컨대 :Control.invoke 및 부모 컨트롤

somelabel.Invoke(...); 

그러나 나는 또한이 같은 형태를 통해 라벨에 액세스 할 수 있습니다 성능이나 다른 기술적 인 측면의 관점에서이 두 조각 사이에 어떤 차이가

MainForm.Invoke(...) //Code for manipulating somelabel 

있습니까?

답변

4

아니요. 모든 Windows Forms 컨트롤은 Invoke 메서드를 노출하며 모두 동일한 방식으로 작동합니다. 어떤 컨트롤을 사용하든 (폼이나 자식 컨트롤과 상관없이) 동일한 기본 작업을 수행하므로 성능은 동일합니다.

개인적으로 개별 컨트롤 대신 양식을 사용하는 것이 좋습니다. 이렇게하면 양식을 호출하는 코드를 손상시키지 않고 컨트롤을 제거하거나 추가 할 수 있으므로 나중에 디자인을 쉽게 다시 작성할 수 있습니다. 또 다른 좋은 옵션은 을 사용하는 것이며 SynchronizationContext.Current을 통해 검색 할 수 있습니다. 이렇게하면 동일한 작업을 수행하지만 컨트롤에 연결되지 않은 Invoke 대신 Send/Post를 통해 사용할 수있는 동기화 컨텍스트를 생성 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 또한 한 번만 호출을 사용해야하고 어떤 차이가 있는지 알고 싶기 때문에 Form.Invoke를 선호합니다. – Giorgi

2

중요하지 않은 것은 중요한 점은 두 컨트롤 모두 동일한 UI 스레드를 사용한다는 것입니다. 실제로 컨트롤을 사용하여 대리자 호출을 마샬링 할 스레드를 결정할 수 있습니다. 일반적으로 어떤 제어를 사용하든 실제로는 을 사용하는 것이 더 명확하지만 결과는 동일합니다.

이 두 개의 서로 다른 UI 스레드 (예 : 하나의 UI 스레드를 사용하여 표시되는 스플래시 화면, 다른 하나는 기본 UI를 작성 중이다)를 사용하는 두 개의 다른 창이있는 경우 효과가 있음을 유의하십시오. UI 슬라이스를 여러 개 쓰고 싶을 때가 몇 가지 있습니다 만, 하나의 윈도우에있는 모든 컨트롤은 동일한 UI 스레드를 사용해야하므로 동일한 윈도우 내에서 모든 UI 객체를 사용하는 것이 좋습니다.

+0

당신은 하나의 프로세스에서 실행 중이지만 여러 UI 스레드가 각 양식/창에 하나씩 공존 할 수 있다고 말하고 있습니까? –

+0

@ o.k.w. 네, 맞습니다. –

관련 문제