c#winform多线程来操作数据库好不好?

zzyhost 2016-07-13 11:31:54
winform程序,如果要向数据库插入成千上万条数据话的需要很长时间界面肯定卡死状态,所以我想把数据库操作写在线程里再弄个进度条,为什么网上有人说写在线程里不好呢?
...全文
604 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuaile999 2016-07-16
  • 打赏
  • 举报
回复
(主界面可以操作) + (数据库插入后显示)这两件事同时执行。“同时”执行。
kuaile999 2016-07-16
  • 打赏
  • 举报
回复
我觉得LZ题目写的有点问题,不过内容说的非常明白。要解决的是界面假死的问题。主界面干操作和插入数据库这两件事同时执行。“同时”执行。 从没说过解决 插入速度的问题。许多人认为他是 用多线程提高插入速度.....。完全扭曲了LZ的意思。 就好比你玩对战游戏,A与B对战,要同时动,A动完B在动!那B不是要先A先动完,那还叫对战游戏么? 然后有人回答,同时动是自欺欺人不能提高移动的速度。同时动,和A先再B的时间是一样的。跟排队一样。这等于废话,谁不知道处理一个对象 和处理两个对象时间不一样。 所以放在线程处理是最佳选择。等干完插入这这件事在跟你汇报即可! 再说了,现在CPU都是多核的,不像以前 完全一个CPU用中断实现, 所以即使你用多个线程处理一个操作,或者界面也是是可以提高点效率的,WIN操作系统本身就是多线程的。 不过.处理前台界面很麻烦,NET控件比较麻烦,容易出错!估计很复杂。
drifter2002 2016-07-15
  • 打赏
  • 举报
回复
费时操作放在后台线程,界面不会卡死。如果sql执行时间长,还是这样好些吧。
黑娃 2016-07-15
  • 打赏
  • 举报
回复
1、多线程去insert一个数据库的一个table肯定是讨不到好的 2、鉴于你insert的record很多,为了不让ui卡,开一个后台线程去insert是明智的
token不能为空 2016-07-15
  • 打赏
  • 举报
回复
学习一下。 楼上大神的大致意思我总结下,是建议你开一个子线程单独操作数据库 而不是开很多线程去“抢占数据库”。
正怒月神 2016-07-15
  • 打赏
  • 举报
回复
就一个子线程用来异步更新,更新完后同步到主界面就好了。这个是没问题的。 当然楼主标题不应该说 '多线程' 操作数据库。 多线程和子线程的异步是两个概念
xuzuning 2016-07-15
  • 打赏
  • 举报
回复
先结论前请先动动脑子! 如果说在一个终端中用多个线程操作数据库不好的话(好像也没说出理由) 那么,多个单线程终端同时操作数据库又会是什么结论呢? 多个线程共享一个数据库连接,这才是不可取的 所以只要是每个线程都有自己的数据库连接,是不会有什么问题的
小灰狼 2016-07-15
  • 打赏
  • 举报
回复
人家是建议楼主启动一个线程做数据库插入操作,不是让你启动多个线程,这是两个意思好吧 启动线程是为了费时逻辑处理较长时,不至于让WinForm界面假死
POPO_POPO 2016-07-15
  • 打赏
  • 举报
回复
多线程操作数据库不好,实际生产环境中的瓶颈一般出在数据库并发访问上。
threenewbee 2016-07-14
  • 打赏
  • 举报
回复
可以,将耗时的操作放在后台工作线程。
  • 打赏
  • 举报
回复
再强调一下,你看你的问题题目是怎么写的。 该是明确定义为“子线程”的时候不要随便盖一个“多线程”的帽子。实际上设计数据操作的部分,要从网络多用户角度考虑。除非你只是编写一个单机的小程序。
大鱼> 2016-07-14
  • 打赏
  • 举报
回复
不要什么问题都要多线程,多线程并不一定好,开线程是很耗性能的,而且线程的管理也不容易。总的来说,能不用多线程的尽量不用。
  • 打赏
  • 举报
回复
哦,“以我想把数据库操作写在线程里再弄个进度条,为什么网上有人说写在线程里不好呢”我看成了多线程。你把“子线程”说成了“多线程”,这很容易误导别人。 一个顺序方法在哪个线程去执行,那么就根本没有什么可纠结的。这样的操作是隐性的设计问题。如果你只是浅浅地考虑到所谓的“主界面不卡”的问题,那么除非你是单机小程序,否则你还是会造成程序很卡、甚至整个多用户的所有客户端都卡死。 因此你可以把这类代码放到子线程。但是如果需求设计原本就是有问题,你不考虑深层的逻辑,那只会造成更多隐性问题。
X-i-n 2016-07-14
  • 打赏
  • 举报
回复
唉,不看清楚楼主说的什么,直接上来就滔滔不绝真的好吗? 麻烦再看多几遍楼主的原帖吧
  • 打赏
  • 举报
回复
引用 4 楼 u012837409 的回复:
什么数据库?sqlserver的的可以直接sqlbulkcopy插入,十几万也就几秒时间而已
那是用在卸掉数据库实时数据服务功能、专门用来导入数据的时间。 如果数据库在很平常的服务的时候,不允许数据表被临时删除各种数据约束、索引关联等等,必须实时支持多用户并发访问,同时支持大批量 insert 操作,那么这个 sqlbulkcopy 就不能使用。
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
至于多线程, 并不是必要的, 多个线程往同一个表插入的话, 会造成堵塞, 反而降低效率。 即使多个线程往不同的表插入, 在服务器的磁盘性能不够的情况下, 也可能没有提高。
是这样的。 不过后半句“服务器的磁盘性能不够的情况下”,这个虽然间接相关,但是一般来说是顺序插入操作也会遇到的瓶颈,其实跟多线程操作并没有直接的因果关系。磁盘写操作一旦没有空闲时间,那么不论是顺序执行 insert 事务还是并发多线程执行 insert 操作都遇到同一个问题。因此它没有直接针对多线程和单线程的区别。
  • 打赏
  • 举报
回复
传统的关系数据库,对于某一个确定的数据表插入数据,是不可能多用户多事务并发的,它会因事务而加锁。只有不同数据表的插入事务才可能并发。 原本应该合并(比如说)200条数据放到一个c# 所显式启用的 Transanction 中(而不是使用数据库系统自动为每一条insert语句产生一个事务)。你现在拆成“一数据一事务”,而且拥挤在一起,会产生大量“超时”问题。 好比如说原本要运10万人过河,只有一条轮渡,一次上200人,这是“你所选择的数据库事务的瓶颈”。你现在每一次只上1人就开船,而且自做主张地让几十、几百人在上船的渡口“打一架”而抢着登船,这当然会使得整体效率比排队顺序过河更慢。 这个跟“多线程操作”没有直接关系。以你的那种方式的数据库事务本身就不能多用户并发,它是加锁的,那么你此时在无关的地方搞什么“多线程操作”就等于不理智的了。
wuhaipinm 2016-07-14
  • 打赏
  • 举报
回复
肯定是好好哒
zzyhost 2016-07-14
  • 打赏
  • 举报
回复
引用 4 楼 u012837409 的回复:
什么数据库?sqlserver的的可以直接sqlbulkcopy插入,十几万也就几秒时间而已
oracle
吉普赛的歌 2016-07-14
  • 打赏
  • 举报
回复
至于多线程, 并不是必要的, 多个线程往同一个表插入的话, 会造成堵塞, 反而降低效率。 即使多个线程往不同的表插入, 在服务器的磁盘性能不够的情况下, 也可能没有提高。
加载更多回复(6)

110,535

社区成员

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

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

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