【问题标题】:Method that adds elements to a DbSet from multiple threads从多个线程向 DbSet 添加元素的方法
【发布时间】:2011-02-23 09:46:20
【问题描述】:
static Object LockEx=new Object();
public void SaveMyData(IEnumerable<MyData> list)
    {
        lock (LockEx)
        {
            using (PersistencyContext db = new PersistencyContext())
            {
                foreach (var el in list)
                {
                    try
                    {
                        db.MyData.Add(el);
                        db.SaveChanges();
                    }
                    catch (DbUpdateException)
                    {
                        db.Entry(el).State = EntityState.Modified;
                        db.SaveChanges();
                    }
                }
            }
        }

    }

从多个线程调用此方法。现在我使用静态锁来避免2个线程同时保存数据。虽然这是错误的,因为我只想保存数据。 catch 用于创建更新查询,以防插入(添加)因条目已存在而失败。

如果我移除锁会发生什么。 SaveChanges 将如何工作?我的代码应该是什么样子?谢谢

【问题讨论】:

    标签: c# multithreading entity-framework-ctp5 locks


    【解决方案1】:

    我会删除锁,因为数据库已经按照设计处理了并发,然后我还会在尝试添加记录之前验证记录是否存在,然后我会根据这个结果进行添加或更新。只是为了避免异常,因为它们是性能杀手。

    【讨论】:

      【解决方案2】:

      基于 Davide 的回答,您还可以在添加所有新实体后调用 SaveChanges 一次。那应该更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多