Метод, который добавляет элементы в DbSet из нескольких потоков - PullRequest
1 голос
/ 23 февраля 2011
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 потоков для сохранения данных одновременно. Хотя это неправильно, потому что я хочу только сохранить данные. Перехват используется для создания запроса на обновление в случае сбоя вставки (Add), поскольку запись уже существует.

Что произойдет, если я сниму замок. Как будет работать SaveChanges? Как должен выглядеть мой код? Спасибо

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Я бы снял блокировку, потому что база данных в любом случае уже обрабатывает параллелизм, затем я также проверю, существует ли запись, прежде чем пытаться добавить ее, затем я добавлю или обновлю в зависимости от этого результата. Просто чтобы избежать исключений, потому что они убивают производительность.

1 голос
/ 31 октября 2011

Опираясь на ответ Давиде, вы также можете вызвать SaveChanges один раз после добавления всех новых объектов.Это должно быть быстрее.

...