2014-03-01 146 views
0

我有一个关于在C#中的长时间等待链之后捕获异常的问题。异步方法中的异常处理

 /// <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(); } 

     } 

当一个异常被提出在new DataContractJsonSerializer(msg.GetType()).WriteObject(_writer.BaseStream, msg); }我想的是例外,通过该调用的方法被捕获等待SendMessageForResponse,如低于

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"); 
     } 

然而的代码中,异常没有被捕获那里。相反,调试器会中断。有什么建议?

回答

4

异常将被捕获。只需在调试器中继续。

+0

或者在没有调试器的情况下运行。 – svick

+0

我正在使用调试器进行压力测试,但是一旦您说我禁用了ctrl + alt + e中的异常以便通过它:) – Ben