在并行操作中,使用DbSet.Add()时遇到的多线程问题如何解决?

2026-05-23 19:440阅读0评论SEO问题
  • 内容介绍
  • 相关推荐

本文共计1252个文字,预计阅读时间需要6分钟。

在并行操作中,使用DbSet.Add()时遇到的多线程问题如何解决?

发现问题时,需求非常简单,只需批量往数据库写入数据。采用Parallel库的并行方式写入,希望能利用计算机多核特性加快程序执行速度。愿望很美好,快速完成了类似底层的字符串操作。

发现问题

需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度。想的很美好,于是快速撸了类似下面的一串代码:

using (var db = new SmsEntities()) { Parallel.For(0, 1000, (i) => { db.MemberCard.Add(new MemberCard() { CardNo = "NO_" + i.ToString(), Banlance = 0, CreateTime = DateTime.Now, Name = "Test_" + i.ToString(), Status = 1 }); }); db.SaveChanges(); }

可意外的是竟然无情的报错了:

奇葩的是当我再次刷新的时候异常又不一样了,于是连着刷新好多次,总结出现过的异常有下面这些:

1、 未将对象引用设置到对象的实例。

2、 已添加了具有相同键的项。

3、 集合已修改;可能无法执行枚举操作。

4、 一个 EdmType 不能多次映射到 CLR 类。EdmType“SmsModel.MemberCard”映射了一次以上。

阅读全文

本文共计1252个文字,预计阅读时间需要6分钟。

在并行操作中,使用DbSet.Add()时遇到的多线程问题如何解决?

发现问题时,需求非常简单,只需批量往数据库写入数据。采用Parallel库的并行方式写入,希望能利用计算机多核特性加快程序执行速度。愿望很美好,快速完成了类似底层的字符串操作。

发现问题

需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度。想的很美好,于是快速撸了类似下面的一串代码:

using (var db = new SmsEntities()) { Parallel.For(0, 1000, (i) => { db.MemberCard.Add(new MemberCard() { CardNo = "NO_" + i.ToString(), Banlance = 0, CreateTime = DateTime.Now, Name = "Test_" + i.ToString(), Status = 1 }); }); db.SaveChanges(); }

可意外的是竟然无情的报错了:

奇葩的是当我再次刷新的时候异常又不一样了,于是连着刷新好多次,总结出现过的异常有下面这些:

1、 未将对象引用设置到对象的实例。

2、 已添加了具有相同键的项。

3、 集合已修改;可能无法执行枚举操作。

4、 一个 EdmType 不能多次映射到 CLR 类。EdmType“SmsModel.MemberCard”映射了一次以上。

阅读全文