2014-09-12 2 views
1

WinForms 응용 프로그램의 백그라운드 스레드에서 .NET class Screen을 사용하여 성공적으로 정의 된 동작인지 궁금했습니다.Screen 클래스를 백그라운드 스레드에서 사용할 수 있습니까?

나는 현재와 같은 기본 화면의 픽셀 크기를 읽고 있어요 : 나는 궁금하네요 왜

var w = Screen.PrimaryScreen.Bounds.Width; 
var h = Screen.PrimaryScreen.Bounds.Height; 

이유 것은 윈폼 클래스 used from the foreground thread only 경향이 있다는 것입니다, 나는 어떤 문서가 있는지 진술을 찾을 수 없습니다 Screen 클래스는 백그라운드 스레드에서 사용하는 것이 안전합니다.

그래서 내 질문은 :

는 백그라운드 스레드에서 Screen.PrimaryScreen.Bounds 속성을 읽어 OK인가?

업데이트 1 :

내 질문 스레드 안전에 대한 하지이므로주의 해주십시오. 그것은 백그라운드 스레드에서 UI 요소에 액세스하는 것입니다.

예. ILSpy을 사용하여이 메서드가 내부적으로 ReleaseDC일 수도 있고이 백그라운드 스레드에서 호출 될 때 허용되지 않거나 정의되지 않은 결과를 발생시키는 것을 발견했습니다.

업데이트 2 : downvoting이 질문을 닫 신고에 대한

감사합니다.

  • 배경 스레드가 어떤 메시지 펌프가 없습니다와 Screen 클래스가 하나가 필요할 수 있습니다

    나는 아직도이 때문에, 비 명백한 될 수 있다고 생각 않습니다.

  • 클래스는 System.Windows.Forms 어셈블리에 있으며 특별한주의가 필요함을 나타낼 수 있습니다.
+1

읽기 전용이므로 이유가 없습니다. – TaW

+0

음, 게시 한 링크에 '스레드 안전성'섹션이 있습니다. 그러나 모든 WinForms 클래스가 백그라운드 스레드에서 안전하지는 않습니다. – Steve

+0

Funny : _Any public static (Visual Basic의 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버는 쓰레드 안전성을 보장하지 않습니다. _ 이제'Bounds'는 아니지만'GetBounds()'가 있습니다. – TaW

답변

4

.NET 스레드 안전성 설명서를 신뢰할 수 없으며 실제로 중요한 문제 만 수정되었을 때만 복사/파스타입니다. 모니터의 가장 중요한 속성은 주위를 뛰어 넘지 않는다는 것입니다. 재생 중에는 읽기 - 수정 - 쓰기가 없습니다.

스레드에서 사용하면 클래스는 매우 thin wrapper 인 MonitorFromXxx() winapi 함수에서 발생합니다. 기본 DeviceIoControl 호출은 항상 안전하며 장치 드라이버는 많은 프로세스를 행복하게 유지해야합니다. 실제로 결과를 의미있는 방식으로 사용하면됩니다.

+0

고마워, 한스, 너의 대답은 나에게 많은 도움이된다. –

+0

흠, 기본 화면을 전환하면 어떻게되는지 궁금합니다. 두 번째 데가 없어서는 안돼. .. – TaW