2

문구 "The current SynchronizationContext is a property of the current thread" correct"을 읽을 수 있습니까? "올바른"현재 SynchronizationContext에 현재 스레드의 속성입니다 ", 나는 ... 조금 혼란 스러워요 VS2010에서 C#을 응용 프로그램 코드에서 책에서 문구

, 입력 할 때 Thread.CurrentThread. Intellisense에서 제공하는 선택 항목의 드롭 다운 목록에서 스레드에 대한 컨텍스트 관련 속성을 찾을 수 없습니다.

"= SynchronizationContext.Current;"을 통해 현재 동기화 컨텍스트를 가져올 수 있습니다. 그러나 이것은 아닙니다. 병렬 스레드, 작업 등에서 동시에 실행되는 것은 매우 행운입니다.

콘솔 또는 WPF (*) app에서 TPL 작업과 a few Windows forms in its own main UI threads을 만들고 시작한다고 가정합니다.

나는 각각의 WinForm이 LongRunning 작업이 orobably 스레드에서 실행됩니다 자신의 WindowsFormaSynchronizationContext가, WPF는 작업 자체 동기화 컨텍스트와 ThreadPool에서 실행되는 인스턴스 자체 DispatcherSynchronizationContext ( SynchronizationContext class의 서브 클래스)이 있어야 가져야한다는 undermisabovestand 풀 자체 동기화 컨텍스트에서 풀 ...

따라서 SynchronizationContext은 (는) 스레드에서 정의 할 수없는 이유는 무엇입니까? "Get SynchronizationContext from a given Thread" 질문에 대한 모든 답은 ... TIS 가능성을 부정에 unanmous에

그리고 마지막으로,하지만 보이지 적어도 :
올바른 문구 "The current SynchronizationContext is a property of the current thread" correct"인가?
그런 다음 특정 스레드 인스턴스마다이 속성의 값을 어떻게 얻을 수 있습니까?

(*)
최근에 나는 winforms를 사용하여 C# WPF 앱 코드를 제공 받았다.

답변

7

정확합니다. SynchronizationContext.Current 속성은 현재 스레드의 m_ExecutionContext 필드를 사용합니다. Thread 클래스의 private 필드는 IntelliSense 드롭 다운에서 보이지 않는 이유입니다.

이 방법이 중요합니다. 기본 SynchronizationContext는 아무 것도 동기화하지 않습니다. 포스트() 메소드 타겟은 스레드 풀 스레드에서 실행됩니다. 대상 호출을 특정 스레드로 마샬링하는 것은 매우 중요하지 않습니다. 대상 스레드의 도움이 필요하면 producer-consumer problem에 대한 해결책을 제공해야합니다. 제네릭 솔루션은 스레드 안전 큐에서 메시지를 검색하는 루프입니다. 정확히 Winforms 또는 WPF 응용 프로그램의 UI 스레드가 작동하는 방식으로 "메시지 루프를 펌프합니다". Application.Run()은 해당 루프를 시작합니다.

그런 응용 프로그램의 UI 스레드 만 스레드 풀 스레드를 사용하여 Post() 대리인 대상을 실행하지 않는 동기화 공급자를 지원할 수 있습니다. 따라서 Winforms와 WPF는 폼이나 윈도우를 만들 자마자 자체 동기화 공급자를 설치합니다. 그리고 UI 스레드에서 실행되는 코드 만 SynchronizationContext.Current 속성에서 기본이 아닌 공급자를 볼 수 있습니다.

결과적으로 호출을 마샬링해야하는 코드를 UI 스레드의 UI 스레드로 다시 초기화해야합니다. 예를 들어 UI 스레드에서 BackgroundWorker를 작성해야합니다. 또는 TaskScheduler.FromCurrentSynchronizationContext로 만든 작업입니다. 기술적으로 UI를 표시하는 스레드가 두 개 이상있을 수 있습니다. init 코드가 실행되는 스레드가 무엇이든 관계없이 Post() 대리자 대상이 실행될 위치를 결정합니다. init 코드가 작업자 스레드에서 실행되고 Post() 대상이 스레드 풀 스레드에서 실행되는 경우 아마 문제를 설명합니다. UI 스레드에서 해당 참조를 얻은 한 Synchronization.Current 개체에 대한 참조를 작업자 스레드로 전달할 수 있습니다.