【问题标题】:Exception being thrown multiple times多次抛出异常
【发布时间】: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#


【解决方案1】:

如果我正确理解您的问题:您希望 尝试foreach 块的每次迭代中运行代码,并始终为每个代码块运行 finally 代码迭代,但只运行一次catch 代码?

如果是这样:

foreach 块之前,定义:

bool caught = false;

然后:

catch (Exception e)
{
    if (caught == false)
    {
        caught = true;
        ...
    }
}

【讨论】:

  • 这不行,我试过了。我认为它不起作用的原因是因为计时器正在关闭它。
  • 定时器 t = new Timer(PingClient, null, 0, 200);
  • 你遇到了什么异常?
  • 在我的问题中以控制台的图像说。说明原因的地方:
【解决方案2】:

我正在制作多个计时器。所以它重叠了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2023-04-03
    • 2014-01-17
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多