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되지 않는 그곳에. 대신 디버거가 중단됩니다. 어떤 충고?
또는 먼저 디버거없이 실행하십시오. – svick
스트레스 테스트 용 디버거를 사용하고 있지만 일단 Ctrl + Alt + e에서 예외를 사용하지 않도록 설정했다고 말하면됩니다. :) – Ben