2015-02-05 34 views
0

所以,我基本上是想讓它運行多個任務,每個任務都有自己的DbContext,這樣它們不會導致異常。基本上,就像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在Unity中成爲PerThread,但這似乎仍然不起作用。我把每線程(以及希望至少)的方式是

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

我只是想能夠運行一組任務的每一個都有自己的DbContext。這樣他們都可以異步執行獨立的數據庫操作。那麼,我該如何取消這種理想的行爲。

+0

什麼是IWorker,它在WorkAsync中有什麼作用? – DixonD

+0

IWorker有1個方法WorkAsync返回一個Task。 – Buttink

+0

如何將IDbUnitOfWork注入到IWorker實現中?如果你只給我們看代碼 – DixonD

回答

1

根據您的意見,我有一個想法,這個問題的原因可能是你定義PerThread一生的IDbUnitOfWork,並在下面的代碼行注入它:

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

所以,你注入IDbUnitOfWork在同一個主線程中,這就是爲什麼你得到相同的實例。

+0

是的,但我該如何解決它。 IDK如何做到像ASP.NET使用的PerHttpRequest一樣。 – Buttink

+0

如果您只需要單獨的IDbUnitOfWork實例,請使用瞬態生命週期,以便每個解決方案都會創建一個新實例。此外,您可以運行單獨的線程,並在每個線程中解析IDbUnitOfWork(在這種情況下,PerThread將工作)。另請注意,運行異步任務並不意味着它運行在單獨的線程中,實際上它們運行在同一個線程中。 – DixonD