首页 新闻 会员 周边

c#多线程问题

0
悬赏园豆:20 [已解决问题] 解决于 2015-07-27 10:24

c/s开发了一个定时根据IP获取硬件信息的服务器程序,目前用的后台单线程处理,每2分钟获取一次,全部IP处理完需要30秒左右,领导说慢了不能接受,而且后期应该会增加ip地址,所以以后可能会更慢。目前我的想法是一个ip开辟一个线程,但是我有些疑惑的是使用多线程还是使用线程池?

ip地址最多情况下有200个左右

分不多,望大神解惑!

夜半汽笛1的主页 夜半汽笛1 | 初学一级 | 园豆:186
提问于:2015-07-27 09:00
< >
分享
最佳答案
0

能讲讲你如何根据 IP 获取硬件信息的吗?

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2015-07-27 09:07

用的TCP协议,根据IP发送指令,硬件那边接收到之后会返回16进制数组,解析成数值就可以了!

夜半汽笛1 | 园豆:186 (初学一级) | 2015-07-27 09:10

@笨鸟先跑: 实际上你是开发了一个 Socket 客户端程序,此客户端需要连接多个 Server 获取数据,同时每个 Server 需要周期性的调用。

 

针对每个单独的 Server,你有两种连接模型可以采用,一是每次获取完数据后断开连接,二是至道连接不可用时才重新建立连接。在获取数据上,后者比前者性能好,因为不用每次都连接;但是需要更多的内存来保持连接,同时也要求服务器始终保持一条空闲连接。你需要根据你们的场景来衡量。

 

由于你已经开始考虑性能问题,因此我建议你使用 Socket 的 xxxAsync 样式的 API,不用为每个 IP 开辟一个线程,你需要学会使用异步模式来处理。

Launcher | 园豆:45045 (高人七级) | 2015-07-27 09:23

@Launcher:谢谢您,按照现在的场景我想了一下肯定会选择第一个模型处理!

            最开始用的异步连接和处理数据,个人能力不足(现学现卖),不知道为什么读取几个后就有脏数据了!说来惭愧,不知道哪里出了问题才改成了同步连接,(PS,不过问题倒是解决了,就是速度慢了许多。。。。汗)!!!

话说  Socket 的 xxxAsync 样式的 API?这是什么东东?

夜半汽笛1 | 园豆:186 (初学一级) | 2015-07-27 09:54

@笨鸟先跑: 随着你的 IP 数的增加,你必须采用异步模式。不论你是“使用多线程还是使用线程池”,被 I/O 访问阻塞的线程越多,你的程序的性能越低。因此,你必须学会 TCP 和异步 I/O 模型。

方法名以 Async 结尾的,或者你也可以采用方法名义 Begin 和 End 开始的:

https://msdn.microsoft.com/zh-cn/library/System.Net.Sockets.Socket_methods(v=vs.110).aspx

Launcher | 园豆:45045 (高人七级) | 2015-07-27 10:01

@Launcher: 好的,谢大神。

夜半汽笛1 | 园豆:186 (初学一级) | 2015-07-27 10:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册