2013-05-29 3 views
0

현재 소켓에서 dat을 읽는 응용 프로그램을 작성 중입니다.예외 후 WaitOne (시간 초과)

내가 정상적인 시간 초과보다 큰 readDone.WaitOne(600000)을 가지고 있다면, 이 콜백 메소드의 예외 때문에 내 ReadCallBack 메소드에서 절대 호출되지 않으면 어떻게 될까요?

제한 시간이 끝날 때까지 기다리거나 ReadcallBack 외부에 정의 된 예외를 처리하여 주 스레드를 계속 종료합니까? 2 분 후에 시간 초과로 설정되어

sendDone.WaitOne를 (120000) :

 public void SendAndReceive(Message message) 
    { 
     try 
     { 
      IPAddress ipAddress = IPAddress.Parse(this.host.Address); 
      IPEndPoint remoteEP = new IPEndPoint(ipAddress, this.host.Port); 

      using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
      { 
       client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client); 
       connectDone.WaitOne(host.Timeout); 

       message.State = MessageState.SENDING; 
       Send(client, message.Request); 

       if (sendDone.WaitOne(120000)) // TIMEOUT SET TO 2 MINUTE 
       { 
        // Request sent successful. Now attempt to retrieve response. 
        message.State = MessageState.READING; 
        Receive(client); 
       } 
       else 
       { 
        message.State = MessageState.SEND_ERROR; 
        message.ErrorMessage = "Timeout while sending request to socket."; 
       }      

       // Release the socket. 
       client.Shutdown(SocketShutdown.Both); 
       client.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      LogManager.ExceptionHandler(ex); 
      message.ErrorMessage = ex.Message; 
      message.State = MessageState.EXCEPTION; 
     } 
    } 


    private void Send(Socket client, String data) 
    { 
     byte[] byteData = Encoding.ASCII.GetBytes(data); 
     System.IO.MemoryStream dataStream = new System.IO.MemoryStream(); 
     dataStream.WriteByte(1); 
     dataStream.Write(byteData, 0, byteData.Length); 
     dataStream.WriteByte(3); 

     client.BeginSend(dataStream.GetBuffer(), 0, dataStream.GetBuffer().Length, 0, new AsyncCallback(SendCallback), client); 
    } 

    private void SendCallback(IAsyncResult ar) 
    { 
     try 
     { 
      var client = (Socket)ar.AsyncState; 
      client.EndSend(ar); 

      // Throw exception before .Set can is called 
      throw new Exception("test"); 

      sendDone.Set(); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

그래서 명확하게 : 여기에 편집

무슨 뜻인지 설명하는 예입니다 즉, .Set()이 2 분 내에 호출되지 않으면 기본 스레드가 계속 실행됩니다. 내 질문은 거기에 예외가있는 경우 SendCallBack .Set() 호출 할 수 있습니다 전에 sendDone 여전히 주 스레드에 대한 2 분 동안 개최됩니다 또는 자동으로 시도 잡아 SendAndReceive 메서드에서 점프를 것입니다?

+0

귀하의 질문에 대한 명확하지 않습니다. 왜 당신은 그것이 전체 타임 아웃을 기다리지 않을 것이라고 기대합니까? –

+1

코드를 게시하면 더 잘 대답 할 수 있습니다. – BlackICE

답변

0

그래서 이것을 테스트하고 예외가 throw되면 WaitOne()이 취소됩니다.