以前做了一个基于udp的高频率传输数据的服务器,但最近要新增一个基于互联网的tcp服务,连接传输倒没问题,但我担心数据频率高会影响效率。我现在在服务器端的数据传输是这样的
for (int i = 0; i < TcpList.Count; i++)
            {
                try
                {
                    TcpList[i].Send(Encoding.UTF8.GetBytes("data..."));
                }
                catch
                {
                    TcpList.RemoveAt(i);
                }
            }如果我不加上try的话,有的时候客户端那边退出了程序,服务器端就会报错了。所以我不得不加了一个try。但是当客户端多的时候,并且传输数据频率高的情况下,这里本身就是一个for循环,每次还得进行一次try(我在书上看到说try很影响效率),怕影响整体的传输效率。
如果tcp这里使用异步send会更好吗?
不知道怎么样处理会更好,哪位高手愿意指点一下,十分感谢!!!

解决方案 »

  1.   

    写或者不屑try,运行速度差多少,你自己的写个测试嘛。
      

  2.   

    如果你缺乏动手能力,总是自己不动手去想办法测试,那么你可能慢慢就变成那种只会在csdn说“请告诉我1+2=3,但是别告诉我为什么=3,因为我根本听不懂”的人了。判断这类最简单问题,不求人“指点”,掌握方法才是真正学到了一点点编程知识。
      

  3.   


    谢谢,请问怎么样测试比较好,算出两种方式的运行时间对比可以不?
    我刚查了一些资料,有个替代方案,感觉似乎更好,
    用这个if(TcpList[i].Connected)来代替try
      

  4.   


    多谢你的建议,我用上try的时候,感觉以前看书的时候说try会很影响性能,尽量避免或少用。。
      

  5.   


    多谢你的建议,我用上try的时候,感觉以前看书的时候说try会很影响性能,尽量避免或少用。。
    当你觉得你这个代码写的无可挑剔,完全不会出现死机,程序死掉的时候那你就不用吧
      

  6.   

    写两个方法,一个有try,另一个没有try,分别调用10000遍,算一下平均执行时间。
      

  7.   


    用不用Try在于开发者能否把握这段代码会不会出异常。在能确定不会出现异常情况就用Try 要不能确定就用上吧。性能慢总比整个程序挂的来的好
      

  8.   

    如果稳定性,正确性差,经常崩溃,效率再高也是白搭啊,try 的影响可以忽略不计。
      

  9.   

    用StopWatch类来检测你的方法有try和无try的时间差别.
      

  10.   

    写两个方法,一个有try,另一个没有try,分别调用10000遍,算一下平均执行时间。
    谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
      

  11.   

    写两个方法,一个有try,另一个没有try,分别调用10000遍,算一下平均执行时间。
    谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
    用byte[]类型来发送数据
      

  12.   

    写两个方法,一个有try,另一个没有try,分别调用10000遍,算一下平均执行时间。
    谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
    自定义协义可以理解为发送业务数据之前把发送类型及长度等信息先发过去,这样对端可以根据这个包头信息进行相应处理;粘包处理就是每次接受完后,根据包头信息进行验证,将完整数据返回给上层逻辑,将不完整的数据暂存,等待下一次数据接收。
      

  13.   

    有的地方是必须要付出代价。try是为了执行不出错,不崩程序。
      

  14.   

    http://msdn.microsoft.com/en-us/library/ms973839.aspx?ppud=4按照MSDN的说法“Bear in mind that this has nothing to do with try/catch blocks: you only incur the cost when the actual exception is thrown. You can use as many try/catch blocks as you want. ”你无需过于担心try/catch
      

  15.   


    不用去掉try catch。因为在重要的地方使用它会比不使用得到的更多。
    知识你的catch可以进行调整一下,表面上看不带参数的 catch 子句捕捉任何类型的异常,实际上这是掩耳盗铃。既然你使用了catch就说明你有可以预见的几种不受控制的情况发生。
    为了保险,自然每种情况应对不用的处理。
      

  16.   

    for (int i = 0; i < TcpList.Count; i++)
                {
                    try
                    {
                        TcpList[i].Send(Encoding.UTF8.GetBytes("data..."));
                    }
                    catch
                    {
                        TcpList.RemoveAt(i);
                    }
                }这段代码除了try之外肯定没有问题嘛???try在频繁IO或者交互的地方。会相当的耗资源。。能不用就不用。。
      

  17.   


    谢谢,我在测试过程中,这段代码运行正常,即使客户端异常退出,也不会受到影响。但是当不用try的时候,万一传输过程中客户端退出程序,那么这里就会抱错,程序崩溃。用if(TcpList[i].Connected)这句也不能代替try,因为无法预知客户端什么时候忽然中断连接。
      

  18.   

    写两个方法,一个有try,另一个没有try,分别调用10000遍,算一下平均执行时间。
    谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
    用byte[]类型来发送数据我现在是用TcpList[i].Send(Encoding.UTF8.GetBytes(“abc”));这个Encoding.UTF8.GetBytes(“abc”) 就是 byte[]吧?
      

  19.   

    for (int i = 0; i < TcpList.Count; i++)
                {
                    try
                    {
                        TcpList[i].Send(Encoding.UTF8.GetBytes("data..."));
                    }
                    catch
                    {
                        TcpList.RemoveAt(i);
                    }
                }
    TcpList.RemoveAt(i);//这句运行后。。 集合应该已经改变了。。
    for (int i = 0; i < TcpList.Count; i++) 
    我感觉这个代码应该是有问题的。
      

  20.   

    表示加不加try对程序的性能没有多大影响
      

  21.   

    凡调用remove方法移除集合的情况,一般都是从最后一个元素开始遍历,这样移除后不会影响下面将要遍历的项。这里改为for (int i = TcpList.Count - 1; i >=0; i--)才对。
      

  22.   

    凡调用remove方法移除集合的情况,一般都是从最后一个元素开始遍历,这样移除后不会影响下面将要遍历的项。这里改为for (int i = TcpList.Count - 1; i >=0; i--)才对。确实,谢谢指出哈 ,已修正
      

  23.   

    凡调用remove方法移除集合的情况,一般都是从最后一个元素开始遍历,这样移除后不会影响下面将要遍历的项。这里改为for (int i = TcpList.Count - 1; i >=0; i--)才对。顶, 又学到一招了!