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");
}
然而的代码中,异常没有被捕获那里。相反,调试器会中断。有什么建议?
或者在没有调试器的情况下运行。 – svick
我正在使用调试器进行压力测试,但是一旦您说我禁用了ctrl + alt + e中的异常以便通过它:) – Ben