2011-10-19 3 views
12

내가 여러 스레드에서 일부 하드웨어에 대한 액세스를 보호하기 위해 뮤텍스를 사용하려고 해요,하지만 난 exitContext 매개 변수가 /이 무엇을 의미하는지에 관해서는 혼란 스러워요 수행합니다WaitHandle.WaitOne 의미에 대한 종료 컨텍스트는 무엇을 의미합니까?

public virtual bool WaitOne (
    int millisecondsTimeout, 
    bool exitContext 
) 

The docs 말 :

exitContext - (동기화 된 컨텍스트 인 경우) 대기 전에 컨텍스트에 대한 동기화 도메인을 종료하고 나중에 다시 획득합니다. 그렇지 않으면 거짓입니다.

... 실제로 그 의미는 무엇이며 true 또는 false로 설정 한 결과는 무엇입니까? 지금은 사실로 설정했고 코드는 작동하는 것처럼 보입니다. 그러나 두려운 점이 무엇인지 완전히 이해하지 못한다는 사실이 불안합니다.

답변

5

또한 설명 further down the page under Remarks 그 :

주의 사항 WaitOne 메서드는 기본이 아닌 관리 컨텍스트 내에서 호출 가 아닌 문맥을

exitContext 매개 변수를 종료하는 것은 효과가 없습니다에. 이는 스레드가 ContextBoundObject에서 파생 된 클래스 인스턴스에 대한 호출 내에있는 경우 발생할 수 있습니다. 현재 클래스에서 ContextBoundObject (String과 같은)에서 파생되지 않는 메서드를 실행하더라도 은 ContextBoundObject가 현재 응용 프로그램 도메인의 스택에 있으면 기본이 아닌 컨텍스트에 포함될 수 있습니다.

코드가 exitContext에 대한 진정한 를 지정, 기본이 아닌 컨텍스트에서 실행중인 WaitOne 방법을 실행 전에 (즉, 기본 컨텍스트로 전환하는) 기본이 아닌이 컨텍스트를 관리 종료 스레드가 발생합니다. WaitOne 메서드 호출이 완료되면 스레드가 원래 기본이 아닌 컨텍스트로 돌아갑니다.

상황에 맞는 바인딩 클래스에 SynchronizationAttribute가있는 경우 유용 할 수 있습니다. 이 경우 클래스의 멤버에 대한 모든 호출이 자동으로 동기화되고 동기화 도메인 이 클래스의 전체 코드 본문입니다. 의 호출 스택에있는 코드가 WaitOne 메서드를 호출하고 exitContext에 대해 true를 지정하면 스레드가 동기화 도메인을 종료하므로 개체의 모든 구성원에 대한 호출에서 차단 된 스레드 인 이 차단됩니다. WaitOne 메서드가 반환되면 호출을 한 스레드는 까지 기다려서 동기화 도메인을 다시 입력해야합니다.

14

MSDN 페이지의 비고 부분은 완전히 험난한 듯합니다. 실행 컨텍스트는 .NET에서 숨겨진 구현 세부 사항입니다. 나는 그것을 완전히 뒤엎을 수 없게 설계된 것을 역전 시켰을 뿐이다.

exitContext 인수는 원격 시나리오에서만 관련이 있습니다.을으로 전달하면 현재 호출이 일시 중단되고 다른 호출이 클라이언트에서 서버로 마샬링됩니다. WaitOne() 호출에 다소 시간이 걸릴 것으로 예상되는 경우에만 true를 선택하여 처리량을 향상시킬 수 있습니다. 그렇게하는 것의 정확한 의미는 나에게는 분명하지 않으며, 내가 아는 곳에서도 문서화되지 않았습니다. WaitOne() 오버로드 (시간 초과 없음)는 항상 거짓을 전달하며, 불행히도 내 설명에 약간의 부담을줍니다.

이 메서드 뒤에있는 부차적 인 이야기는 Microsoft가 .NET 2에서 이전 버전과의 호환성을 깨기로 결정한 것이 너무 잘 이해되지 않았다는 것입니다. 서비스 팩 2에 WaitOne (int) 오버로드가 추가되었습니다. exitContext 인수 이로 인해 많은 사람들이 혼란에 빠졌고, 프로그래머는 SP2를 사용하기 시작한 후 SP2 이전 버전의 .NET에서 실행할 때 프로그램이 실패하는 것을 발견했습니다. 아야.

관련 문제