用多线程将多个串口存入SQL会有问题吗?(C#)

penn_luo 2015-09-13 12:22:51
我的winform有四个串口接收事件,一个串口连续收3条数据(大约隔1秒不到一条,三条完了就等待下组测试数据,每组测试数据都是3条数据),现在数据收集到了,且已经解码并实时显示到界面label,剩下需要的就是再存入SQL,四个串口事件接收到的数据都是一样的格式,且将这些数据都存同一个表中(约30个字段),小生想请教各位大师,是开多个线程还是怎么做呢?开多个线程同时操作同一数据库,同一个表会造成死锁这些大问题吗??我之前一直琢磨,回一条存一条,感觉容易数据错误,后面想等每个串口接收完三条数据后一起将界面的label.Text 存入SQL,这样可行吗?我是初学者,还在学,望各位大师指教,谢谢!
...全文
158 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
penn_luo 2015-09-14
  • 打赏
  • 举报
回复
引用 5 楼 guestb 的回复:
不会的,可以使用多线程。
谢谢,不会,我多虑了,得多学习学习
penn_luo 2015-09-14
  • 打赏
  • 举报
回复
引用 6 楼 ajianchina 的回复:
你这玩意儿非常适合用多线程啊,数据库死锁的问题,他的产生也是需要具备一定的条件的,不是你想让他死锁就死锁,一般发生在多个进程同时需要请求数据库的同一资源,而这一资源一直被占用而不被释放才会导致锁死,这个问题你不用太担心。 你可以这样设计,子线程不要操作数据库,子线程取到3条数据后,都插入到同一个DataTable中,存入数据库的操作全部交给主线程去完成,主线程可以设定每隔一定时间长度将DataTable数据转存一次到数据库中,因为可以利用SqlBulkCopy一次性的将数据COPY到数据库,而不需要每条循环Insert,所以效率非常高,同样数量的数据集通过这两种方式存储,SqlBulkCopy的用时差不多是循环Insert的四分之一时间。主线程跟各子线程进入操作DataTable时加一个Lock,你可以先这样测试看下。
谢谢,听说过SqlBulkCopy,也看过好几个博客关于SqlBulkCopy的代码测试,存储时间特别短,但没用过,上面留给我的时间短,我也就没去弄,现在的方法是:在各个串口接收委托事件中赋值给存储过程的变量,sql创建了一个INsert存储过程,速度也可以(对应字段不多的数据,应该时间上不会差别吧?),现在也在运行中,等程序跑起来再修改,换成SqlBulkCopy试试,谢谢!
penn_luo 2015-09-13
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
保存就关闭,不会造成死锁,你这个如果用多线程的话,麻烦点就在于你如何保证数据是对应的,不会导致线程一的数据被保存到线程二的数据里去
谢谢,确实这个要考虑,准备用存储过程把界面的label显示一起存入SQL试试,但是多个线程同时在一个表上Insert没影响?
penn_luo 2015-09-13
  • 打赏
  • 举报
回复
引用 1 楼 diaodiaop 的回复:
既然是初学 那么你懂线程吗? 你懂死锁吗? 用过吗 遇到过吗? 所以不如先去写试试在来问.... 所以我对这个问题的答案是 "可行" 试试吧
谢谢,先尝试写写再看
  • 打赏
  • 举报
回复
保存就关闭,不会造成死锁,你这个如果用多线程的话,麻烦点就在于你如何保证数据是对应的,不会导致线程一的数据被保存到线程二的数据里去
by_封爱 版主 2015-09-13
  • 打赏
  • 举报
回复
既然是初学 那么你懂线程吗? 你懂死锁吗? 用过吗 遇到过吗? 所以不如先去写试试在来问.... 所以我对这个问题的答案是 "可行" 试试吧
ajianchina 2015-09-13
  • 打赏
  • 举报
回复
你这玩意儿非常适合用多线程啊,数据库死锁的问题,他的产生也是需要具备一定的条件的,不是你想让他死锁就死锁,一般发生在多个进程同时需要请求数据库的同一资源,而这一资源一直被占用而不被释放才会导致锁死,这个问题你不用太担心。 你可以这样设计,子线程不要操作数据库,子线程取到3条数据后,都插入到同一个DataTable中,存入数据库的操作全部交给主线程去完成,主线程可以设定每隔一定时间长度将DataTable数据转存一次到数据库中,因为可以利用SqlBulkCopy一次性的将数据COPY到数据库,而不需要每条循环Insert,所以效率非常高,同样数量的数据集通过这两种方式存储,SqlBulkCopy的用时差不多是循环Insert的四分之一时间。主线程跟各子线程进入操作DataTable时加一个Lock,你可以先这样测试看下。
guestb 2015-09-13
  • 打赏
  • 举报
回复
不会的,可以使用多线程。

110,476

社区成员

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

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

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