2014-03-01 2 views
0

C#에서 오랫동안 기다려온 체인이 끝난 후 예외를 catch하는 것과 관련하여 질문이 있습니다. 내가 호출하는 방법으로 잡힐 해당 예외를 싶습니다 new DataContractJsonSerializer(msg.GetType()).WriteObject(_writer.BaseStream, msg); }에서비동기 메서드에서 예외 처리

예외가 발생
 /// <summary> 
     /// Waiting on this waits on a response, be warned! 
     /// </summary> 
     /// <param name="msg"></param> 
     /// <returns></returns> 
     public async Task<ComMessage> SendMessageForResponse(ComMessage msg) 
     { 
      lock (_responses) 
      { 
       _responses[msg.transactionid] = null; 
      } 

      await SendMessage(msg); 

      return await Task.Run<ComMessage>(() => { 
       lock (_responses) 
       { 
        while (_responses[msg.transactionid] == null) Monitor.Wait(_responses); 
        var response = _responses[msg.transactionid]; 
        _responses.Remove(msg.transactionid); 
        return response; 
       } 

      }); 


     } 

     /// <summary> 
     /// Sends a message, serialized as JSON, to the game 
     /// </summary> 
     /// <param name="msg"></param> 
     /// <returns></returns> 
     public async Task SendMessage(ComMessage msg) 
     { 
      try 
      { 
       await _semaphore.WaitAsync(); 
       await Task.Run(() => { new DataContractJsonSerializer(msg.GetType()).WriteObject(_writer.BaseStream, msg); }); 
      } 
      finally { _semaphore.Release(); } 

     } 

는 그러나

try 
     { 
      var t = await St0rmCom.Instance.SendMessageForResponse(com); 


      MessagePlayerInfoResponse pi = (MessagePlayerInfoResponse)t; 
      StringBuilder sb = new StringBuilder(); 
      Debug.LogInfo("Iterating {0} players", pi.playerinfo.Length); 
      for (int i = 0, count = 0; i < pi.playerinfo.Length; ++i) 
      { 
       MessagePlayerData p = pi.playerinfo[i]; 
       ++count; 
       sb.AppendFormat("\"{0}\" ", p.name); 
       if (sb.Length > 250 || i == (pi.playerinfo.Length - 1)) 
       { 
        Debug.LogInfo("Sending a PI Line."); 
        cmd.Reply("({0}): {1} ", count, sb.ToString()); 
        sb.Clear(); 
        count = 0; 
       } 
      } 
     } 
     catch (Exception) 
     { 
      cmd.Reply("Request failed."); 
      //Debug.LogError(e, "Request Failed"); 
     } 

아래의 코드로 SendMessageForResponse를 기다리고, 예외가 catch되지 않는 그곳에. 대신 디버거가 중단됩니다. 어떤 충고?

답변

4

예외가 발견됩니다. 디버거에서 계속 진행하십시오.

+0

또는 먼저 디버거없이 실행하십시오. – svick

+0

스트레스 테스트 용 디버거를 사용하고 있지만 일단 Ctrl + Alt + e에서 예외를 사용하지 않도록 설정했다고 말하면됩니다. :) – Ben

관련 문제