2015-02-05 3 views
0

Итак, я в основном пытаюсь сделать так, чтобы я мог запускать несколько задач, каждая из которых имеет свой собственный DbContext, чтобы они не вызывали исключения. Таким образом, в основном, как работает async-обработчики ASP.NET. Прямо сейчас я сделать что-то к эффектуМножественная структура сущности DbContext по-прежнему приводит к параллельному исключению

// set up the unity container 
// WON'T WORK the dbUnitOfWork will used in two tasks. 
container.RegisterType<Framework.Data.IDbUnitOfWork, Framework.Data.EntityFramework.DbUnitOfWork>(Core.IoC.Lifetime.PerThread); 
container.RegisterFactory<System.Data.Entity.DbContext, ContextFactory>(o => o.Create, Framework.Core.IoC.Lifetime.Transient); 



AsyncContext.Run(() => app.Run()); 
// run the following code fragment with an Async Context from Nito 



workers.AddRange(container.resolveAll<IWorker>()); 
foreach (var worker in workers) { 
    tasks.add(worker.WorkAsync()); 
} 
Tasks.WhenAll(tasks); 

, но случается, что каждый раз, когда я получаю этот проклятый «NotSupportedException» из-за вторую операцию начался в том же DbContext. Я попытался сделать свой DbContext PerThread в Unity, но это все еще не работает. То, как я вытащил из каждого потока (ну, надеясь, по крайней мере) является

Tasks.Run(() => worker.WorkAsync()); 

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

+0

Что такое IWorker и что он делает в WorkAsync? – DixonD

+0

IWorker имеет 1 метод WorkAsync, который возвращает задачу. – Buttink

+0

Как вы добавляете IDbUnitOfWork в реализацию IWorker? Было бы проще, если бы вы просто указали нам код – DixonD

ответ

1

Исходя из ваших комментариев, у меня есть идея о том, что причиной проблемы может быть, что вы определили PerThread жизни IDbUnitOfWork и вводят его в следующей строке кода:

workers.AddRange(container.resolveAll<IWorker>()); 

Таким образом, вы впрыснуть IDbUnitOfWork в том же главном потоке, и именно поэтому вы получаете тот же экземпляр.

+0

Да, но как это исправить. IDK, как сделать, как PerHttpRequest, который используется ASP.NET. – Buttink

+0

Если вам нужны только отдельные экземпляры IDbUnitOfWork, используйте временное время жизни, чтобы каждое решение создало новый экземпляр. Кроме того, вы можете запускать отдельные потоки и в каждом из них разрешать IDbUnitOfWork (в этом случае PerThread будет работать). Также обратите внимание, что выполнение async-задачи не означает, что она выполняется в отдельном потоке, фактически они запускаются в одном потоке. – DixonD

Смежные вопросы