从多个采集器取数写入数据库该怎么实现?

liuxg6 2018-11-02 01:20:04
各位大神,本人自学C#编程,以前做一些小程序没有问题,现在遇到一个软件,想问一下如何实现:

要从一批采集器上采集数据,大约100个左右,通过sockets取数,要求一秒钟采集一条,然后写入到数据库中,每台设备对应一张表,现在单台采集通过Timer控件实现,那么100台设备应该怎么实现:

1、使用多线程吗,以前没怎么用过多线程,有没有例子?
2、我要是用代码声明一些Timer控件,每一个设备用一个Timer控件可行吗?
3、或者直接放置一些Timer控件,每个控件控制10台设备,每秒钟从这十台设备取数,存入数据库可行吗?

请高手指点一下,这种情况怎么实现效率最高,需要用到什么技术?

一点思路也没有,谢谢!

...全文
341 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如果是如 #2 楼所说那样将设备的特种特性、定时任务封装到一起,那么就是在你的程序中声明
List<A> abc = new List<A>();
这样 A 对象实例内部知道自己是什么设备,它内部有一个 Timer 对象用来定时启动采集任务。但是从大的布局上看,仍然是使用集合 List<> 先来封装对象。先从面向对象系统分析设计的角度来定义好程序中的 Model,这是结构、分类、接口继承概念,而不要纠结什么“线程”这类简单概念。 所谓线程,不过就是说把
private void Timer_Tick(object sender, EventArgs e)
{
    a();
    b();
    c();
}
这类代码改为
private void Timer_Tick(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        a();
        b();
        c();
    });
}
这类异步执行代码,这有什么? 所以比较好的思路是:先把定时器驱动、面向对象封装系统结构等方面的基础打好。不要纠结个别底层的纯技术语句。
  • 打赏
  • 举报
回复
引用 0 楼 liuxg6 的回复:
2、我要是用代码声明一些Timer控件,每一个设备用一个Timer控件可行吗? 3、或者直接放置一些Timer控件,每个控件控制10台设备,每秒钟从这十台设备取数,存入数据库可行吗?
如果要实例化并且运行100个(或者说n个)Timer控件,那么在你的窗体类中声明一个
List<Timer> tms = new List<Timer>();
集合就行了,而不是用鼠标把 Timer 拖到窗体来声明的那种简单做法。
吉普赛的歌 2018-11-02
  • 打赏
  • 举报
回复 1
帮你写了一个完整的代码, 效果不错, 你可以看看: https://blog.csdn.net/yenange/article/details/83662675
sdfgrtyu 2018-11-02
  • 打赏
  • 举报
回复
楼上说的对,处理数据的时候不需要锁。
反正意思大概就是发送100个命令,然后并发处理返回的响应数据,
如果支持取消和超时功能就要用到锁,在发出100个命令后,开启一个定时器,
判断数据返回是否超时,
超时和全部数据处理完毕和取消可能冲突,
然后进行下一次索数。
不需要自己写线程,用系统自带的方法。



吉普赛的歌 2018-11-02
  • 打赏
  • 举报
回复
1秒 100 条数据, 不算太多, 当然能配置好点的硬盘更好。 如果你按我#1的做法, 线程池, 各个设备都是独立的, 彼此之间不需要共享数据, 程序这边用不到什么锁。 至于数据库, 只有插入的话, 数据库会自动为你分配锁, 不用担心, 也不需要你操心什么锁。 但如果你要查这个表的话, 最好是:

select top 10 * from tableName with(nolock)
加上 with(nolock) , 避免阻塞。 这个表的设计应该尽量简单, 不要太多字段, 每个字段的长度也尽可能短, 不要用默认约束。 还有, 你这个表一天的数据量=100*3600*24=8640000 一天就 8百多万数据, 你需要考虑分历史表和当前表, 数据库的规划很重要。 哪些数据需要定时迁移到历史表, 哪些数据可以定时从历史表中删除……
sdfgrtyu 2018-11-02
  • 打赏
  • 举报
回复
意思就是说你需要考虑可扩展性,需要用到锁和异步
liuxg6 2018-11-02
  • 打赏
  • 举报
回复
引用 3 楼 u010941149 的回复:
一台设备就是一个服务器,这个就需要你同时发送100个连接,然后同时回来100条数据,这用到的技术就比较多了,很定需要考虑到竞争的问题,你用的什么数据库



是的,就怕到时候会出问题,用的是SQLServer2008
sdfgrtyu 2018-11-02
  • 打赏
  • 举报
回复
一台设备就是一个服务器,这个就需要你同时发送100个连接,然后同时回来100条数据,这用到的技术就比较多了,很定需要考虑到竞争的问题,你用的什么数据库
xuzuning 2018-11-02
  • 打赏
  • 举报
回复
现在是单台采集通过Timer控件实现
你把它封装成类A

一台设备就 new A()
10台设备就 newA() 10次
1000台设备就 newA() 1000次
当然,每个 A 的实例中的设备号和存储表是不一样的,你可以作为参指派
吉普赛的歌 2018-11-02
  • 打赏
  • 举报
回复
https://www.cnblogs.com/yifengjianbai/p/5499493.html 类似这个这么写都可以的。 初始就每个采集器都开始运作, 操作完停1秒再进行下一下操作。 很简单, 不需要想太多。

110,586

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧