【发布时间】:2015-05-03 04:08:16
【问题描述】:
基本上,我想从代码块中捕获任何异常,然后触发所述代码。
try {
CODE
catch (Exception e)
{
DO THIS ONCE
}
finally
{
CODE
}
深入
所以我一直在创建 TCP/SOCKET 服务器。它可以与多个客户一起工作。并发送/背诵 (I/O) 数据。它运作良好,并且已经存在很长时间了。但我在控制台中发现它是这样写的:
这很糟糕,因为如果它认为用户断开了两次连接,就会产生很多问题。我知道用户是否断开连接的方法是每 200 毫秒向他们发送一次数据。如果出现错误,则打印它们已断开连接,将它们从客户端列表中删除,然后断开流/tcp。
static bool currentlyUsing;
private static void PingClient(Object o)
{
if (!currentlyUsing)
{
if (clientsConnected.Count != 0)
{
foreach (Client c in clientsConnected)
{
try
{
c.tcp.Client.Blocking = false;
c.tcp.Client.Send(new byte[1], 0, 0);
}
catch (Exception e)
{
currentlyUsing = true;
Console.WriteLine("[INFO] Client Dissconnected: IP:" + c.ip + " PORT:" + c.port.ToString() + " Reason:" + e.Message);
clientsConnected.Remove(c);
c.tcp.Close();
break;
}
finally
{
currentlyUsing = false;
}
GC.Collect();
}
}
}
有没有办法让它只捕获一次,或者多次捕获但只触发一次我想要的代码?
【问题讨论】:
-
还必须有一些您从客户那里收到的代码。当您收到 0 个字节时,这意味着他关闭了他的套接字,然后您必须这样做。您的 ping 机制适用于其他类型的故障。
-
您是否在计时器上调用此代码?发送的超时时间是多少?猜猜你在完成第一个循环之前是否正在启动另一个 ping
-
是的,我正在计时。
-
你需要让它更加线程安全。可能会在客户端对象中添加一个“pinging in progress”标志
-
嗯,或者可能是断开连接的冷却时间。
标签: c#