2010-04-15 3 views
0

리틀 인트로 :.NET에서 중단 스레드가 발생하면이 코드 조각이 손상 될 수 있습니까?

복잡한 다중 스레드 응용 프로그램 (ESB 엔터프라이즈 서비스)에서이 ESB는 하드웨어 보안 모듈과 통신하는 사용자 작성 모듈을 허용하므로 Thread.Abort를 사용해야합니다. 따라서이 모듈이 교착 상태에 빠지거나 하드웨어가 응답을 멈추는 경우 -이 모듈을 언로드해야하고 나머지 서버 응용 프로그램은 runnnig를 유지해야합니다.

따라서 사용자 섹션에서만 코드를 중단 할 수있는 중단 동기화 메커니즘이 있으며이 섹션은 AbortAble으로 표시되어야합니다. 이런 일이되면 ThreadAbortException이 코드의 pieace에 던져 질 것이다 가능성이 있습니다 (중단) : 예를 들어, 모듈에


public void StopAbortSection() 
     { 
      var id = Thread.CurrentThread.ManagedThreadId; 
      lock (threadIdMap[id]) 
      { 
       .... 
      } 
     } 

이 AbortSection에 있고 ServerAplication 사용자 모듈을 중단하기로 결정 (유사한 방법 StartAbortSection 호출하여 입력)이 있지만, 이 결정 이후 실제 Thread.Abort가 발생하기 전에 모듈은이 메소드를 호출하여 NonAbortableSection에 들어가지만 잠금은 실제로 해당 잠금 객체에서 수행됩니다.

따라서 잠금은 Abort가 실행될 때까지 차단되지만이 코드에서이 블록에 도달하기 전에 중단을 실행할 수도 있습니다. 그러나이 방법을 사용하는 객체는 필수적이며 코드의 파이어스가 언제든지 중단 될 수 있는지 확인해야합니다. 예를 들어, 사전에서 읽을 때 어떤 일이 발생하는지 알지 못합니다.

그래서 threadIdMap은 Dictionary (int, ManualResetEvent)이고 Locking 객체는 ManualResetEvent 인스턴스입니다.

내 질문에 대한 답을 얻기를 바랍니다. 그것의 대단히 죄송합니다.

+0

'Thread.Abort'는 스레딩 문제에 대한 해결책이 아닙니다. –

+0

나는 Thread.Abort의 anout 잘못 알고있다. 그러나 그것은 필요하다 :. – bosko

답변

1

"위반 함"이란 무엇을 의미합니까?

ThreadAbortException은 코드의 아무 곳이나 던져 질 수 있습니다. 잠금은 다른 스레드를 중단시키는 하나의 스레드가 아니면 스레드를 중단시키는 코드가 잠금 내부에 있고 스레드가 동일한 오브젝트를 잠그지 않는 한 전혀 영향을 미치지 않습니다.

스레드가 효과적이기 위해서는 동일한 개체를 잠글 수 있어야합니다. 사전에 동일한 ManualResetEvent 객체에 대한 참조를 포함하는 다른 항목이 없으면 잠금은 전혀 쓸모가 없습니다.

+0

이제 잘못 된 방법으로 정의 된 내 질문을 볼 수있다., 죄송합니다, 다시 읽기 바랍니다. – bosko

관련 문제