跟加锁没有关系,你的子线程中不能使用做为foreach循环变量的model变量。你需要在foreach方法内部另外声明一个变量,把model赋值给它,然后在你你的 threadstart 中使用这个局部声明的变量(而不是model)。
另外,这丝毫不会让插入动作变快,相反可能稍慢。只是界面上反映“快”了而已。
你可以把多条insert拼接成一个sql语句一次性插入
也可以定义个存储过程,把生成的字符串数组传进去,让数据库自己循环插入
也可以先循环生成随机数,放到一个数组里,再用多线程去数组里取值然后插入
不过多线程也不过是让界面看起来不卡而已,后台数据还是都在排队,并不是一股脑的都扔给服务器了
3楼的解法我试了,有效果,数量对了,但是生成的SN码还是有重复的,是不是第二个方法哪个地方也需要改一下?用多线程其实就是为了页面上看上去“快”而已,只要用户等待时间不长就可以,后台执行个1,2分钟也没事,这只是延迟一下没关系。
生成SN又不耗多少时间,你先循环生成不重复的SN,然后开多线程入库不行吗
在不同线程里去执行生成SN,难免会重复
而且把你SN生成的方法放出来,是否本身算法就有问题
我知道了,原来的是生成一个SN立刻插入数据库,然后每次再生成就去判断一下是否已经存在数据库中,而现在是先生成,最后统一插入数据库,所以判断的时候就不是去数据库判断了,而是判断刚生成的SN中是否已存在,这样才不会重复。
还有你说的,方法我也试过,组成一个“1111,2222,333”这样的格式的SN去数据库循环插入,也很费时,统一组成DataTable使用SQLBulkCopy拷贝也很费时,使用多线程就是让页面不再等待,这个生成SN的方法在后台默默执行就可以,执行3分钟都没关系