Параллельный доступ к объектам EF4 (Parallel + EF4) - PullRequest
0 голосов
/ 22 сентября 2010

В настоящее время я работаю в диспетчерской службе, которая обрабатывает тысячи сообщений, доставляемых по разным каналам (электронная почта, личное сообщение, сообщение приложения) с использованием EF4 и WCF.

Чтобы попытаться ускорить отправку сообщений, я 'я пытаюсь использовать Parallels:

Parallel.ForEach(currentMessageList, m =>
{
Processors.DispatcherWrapper.Dispatch(m, m.unfChannels.AgentName, m.unfChannels.AgentParameters);
}
);

В методе My Dispatch используется отражение, чтобы сопоставить метод конфигурации канала и обрабатывать каждое сообщение одновременно, но у меня возникают большие проблемы при попытке обновить объекты EF в потоках, когда я делаю SaveChanges() к глобальной сущности (инициализируется в application_start)

Проблемы бывают разных типов:

  • Пустые ссылки на объекты
  • Элемент списка Свойство является частью объекта.Информация о ключе объекта и не может быть изменена.
  • Базовый поставщик не удалось открыть.
  • Новая транзакция не разрешена, поскольку в сеансе работают другие потоки.(после принудительного открытия соединения, если оно закрыто)

Вопрос в том, является ли EF4 поточно-ориентированным для реализации этого сценария?Является ли мой подход к созданию глобальных сущностей лучшим решением, или я должен сделать для каждой задачи инициализации EF4?

Любая помощь приветствуется, я уже потерял 2 часа, пытаясь найти возможный обходной путь.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

Использование общего контекста для одновременных вызовов WCF - очень плохая практика.Вы должны всегда использовать новый контекст для каждого вызова.Я объяснил причину здесь .

1 голос
/ 23 сентября 2010

У меня нет отличного ответа для вас, но когда я столкнулся с схожей проблемой, я закончил тем, что добавил все свои изменения в статический общий System.Collections.Concurrent.ConcurrentBag, а затем зафиксировал их после завершения всех потоков / задач.

Это компромисс, но может быть "достаточно хорошим" решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...