4

나는이 질문에 대한 답변을 전부 찾아 보았지만 만족할만한 대답을 찾을 수 없습니다. 어쩌면 여기 누군가가 나를 계몽 할 수 있을지도 모른다.SynchronizationContext 및 InvokeRequired

나는 UI 스레드에서 변경된 이벤트를 발생시키기 위해 SynchronizationContext 개체에 대한 참조를 저장하는 BindingList<T>의 하위 항목이 있습니다.

이제이 BindingList<T>이 생성되어 UI 스레드에서 사용되고 백그라운드 스레드로 사용되지 않았을 수도 있습니다. InvokeRequired과 같은 속성없이이 기능을 어떻게 확인할 수 있습니까? UI 스레드에서 SynchronizationContext.Send을 호출하면 어떤 결과가 발생합니까?

+0

이 정보를 확인하는 것이 좋습니다. SynchronizationContext.Current는 바인딩 목록이 작업자 스레드에서 만들어 질 때 null이됩니다. Send()는 UI 스레드에서 즉시 실행됩니다. –

+0

UI에 바인딩 된대로 SynchronizationContext를 목록에 전달합니다. 그리고 ListChanged 이벤트를 발생시킬 때 사용하기 전에 SynchronizationContext가 있는지 확인합니다. – Dan

답변

2

SynchronizationContext의 Send 메서드는 동 기적으로 실행되고 SynchronizationContext이 바인딩 된 스레드의 delegane을 호출합니다. SynchronizationContext이 UI 스레드에 바인딩되어 있고 코드가 UI 스레드에서 현재 실행 중이면 대리자는 스레드간에 마샬링 할 필요없이 직접 호출됩니다.

-1

send 메서드는 동기식으로 UI 스레드에서 실행됩니다. 그러나 걱정할만한 결과 중 하나는 Send를 호출하면 호출 스택이 증가한다는 것입니다.

따라서, 예를 들어, 다음 코드를

for (int i = 0; i < 10000000; i++) syncContext.Send(....); 

이 StackOverflow의 예외가 발생합니다 ... 당신이 이미 원하는에서 실행하는 경우 동기화 컨텍스트를 사용하지 않는 것이 현명 할 수있는 이유 실. 목록이 작성된 스레드를 확인하기위한 완전한 증거 방법에 대해서는 알지 못합니다. 내부 정리를 수행하는 것 외에도.

+1

확실히 그렇지 않습니다! 우선 스택은 쓰레드마다 할당 된 구조이다. 모든 보내기는 위임자를 게시하고 ** 완료 될 때까지 기다립니다 **. 그것은 뮤텍스로 이것을합니다. 게시 한 루프는 작업자 스레드 또는 UI 스레드의 스택을 1 개 이상 증가시키지 않습니다 (작업자 스레드에서 보내기, UI 스레드에서 대리자 호출). 'SynchronizationContext'가 충분히 똑똑하다면, UI 쓰레드에서 호출하면 스택에 하나의 프레임 만 전달됩니다. – Gusdor