2013-08-16 1 views
0

스레드를 만드는 클라이언트가 있습니다.ManualResetEvent가 작동하지 않습니다. 스레드

그 스레드는 WaitOne()이므로 거기에 붙어있는 동안 내 클라이언트는 죽지 않습니다. 그러나 클라이언트를 종료하려면 해당 수동 재설정 이벤트에서 Set()을 수행해야합니다.

public ManualResetEvent mreIn = new ManualResetEvent(false); 

이 시작 기능 스레드 만들어 내 Connect 기능입니다 :

내가 메인 클래스의 수동 리셋 이벤트 선언

public void Connect() 
    { 
     objClientThread = new Thread(start) { IsBackground = true }; 
     objClientThread.Start(); 
    } 

    /// <summary> 
    /// Starts the client program. 
    /// </summary> 
    private void start() 
    { 
      //We Open the proxy to let connections happen 
      objProxy.Open(); 
      if (performHandshake()) 
      { 
       IsConnected = true; 
       DelayedShutdownBool = false; 
       //While connected, the thread keeps the client alive 
       mreIn.WaitOne(); 
       if (OnShutdownInitiated != null) 
       { 
        OnShutdownInitiated(this, new EventArgs()); 
       } 
       System.Threading.Thread.Sleep(500); 
       objProxy.Close(); 
       objConfiguration = null; 
       IsConnected = false; 
       mreOut.Set(); 
      } 
     } 

을 그리고 난 않는 콜백이 Set() :

Boolean IServiceCallbackContract.Shutdown() 
    { 
     mreIn.Set(); 
     return true; 
    } 

그래서 방법 일 is works is ... 모든 모듈이 초기화되고 차단되었습니다. WaitOne() 모듈을 종료하면 콜백은 Set()을 수행하지만 WaitOne()은 잠금 해제되지 않고 스레드가 계속되지 않습니다. 내가 무엇이 누락 되었습니까?

+0

첫 번째 확인 : 동일한 인스턴스에서 콜백이 실행됩니까? –

+0

예, 콜백은 동일한 인스턴스를 실행합니다. 클라이언트는 executeAssembly와 함께 실행되는'.exe '입니다. 이'.exe'는 클라이언트 클래스의 인스턴스를 가지고 있습니다. 'exe'가 시작되면'Connect()'함수가 호출되어 스레드를 생성합니다 – AAlferez

+0

그러나 objProxy는 잘못 명명 된 호스트처럼 보입니다. –

답변

2

문제는 서비스 클라이언트를 만들 때 콜백의 instace 컨텍스트를 전달해야하고 new을 수행 했으므로 current 인스턴스 컨텍스트를 넣지 않았으며 콜백이 다른 것에 수행되고 있음을 나타냅니다. 예를 들어, 내가하고 있었던 가치 또는 사건의 모든 변화는 현재의 사고에 반영되지 않았습니다. 감사합니다. @HenkHolterman :

0

올바른 방법으로 ManualResetEvent를 사용하고있는 것 같습니다. 하지만 스레드는 배경입니다. 다른 백그라운드가 아닌 스레드가 모두 종료되면 스레드가 임의의 위치에서 중단되고 mreIn.WaitOne() 이후의 코드가 실행되지 않을 수 있습니다.

그런 경우 배경이 아닌 therad를 만들면 문제가 해결됩니다.

+0

이 백그라운드 스레드는 이벤트 핸들러가있는 다른 스레드를 제어합니다. 그리고 다른 스레드는 확실히 죽은되지 않습니다. 확실한 100 % – AAlferez