2012-09-17 55 views
3

我的應用程序中有兩個線程。一個線程(實際上它是一個可以被另一個系統調用的web api)。new一個上下文來保存實體(調用savechanges()方法)。另一個線程(它是一個真正的工作線程)。新的一個Context來計數實體(調用count()方法)。而這兩個線程正在同一個實體上工作。當我的應用程序運行時,有時會拋出異常。 這是它。請檢查它。多線程EF 5

System.InvalidOperationException 
Stack: 
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() 
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(System.Type) 
at System.Data.Entity.Internal.Linq.InternalSet`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Initialize() 
at System.Data.Entity.Internal.Linq.InternalSet`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].get_InternalContext() 
at System.Data.Entity.Infrastructure.DbQuery`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].System.Linq.IQueryable.get_Provider() 
at System.Linq.Queryable.Count[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Linq.IQueryable`1<System.__Canon>, System.Linq.Expressions.Expression`1<System.Func`2<System.__Canon,Boolean>>) 
at Accela.HotDeploy.Website.Facade.DeployLogService.GetUpgradeProcess(System.Guid) 

我相信它一定是由一些線程問題引起的。對於這個問題的任何想法?謝謝。

回答

1

EF不是線程安全的。您不能在多個線程中使用相同的ObjectContext。你甚至不能同時執行讀取查詢。

因此,您需要同步(使用鎖)或對不同的線程使用不同的ObjectContexts

+0

稍等片刻,你是否注意到我提到每個線程都有一個新的上下文。我認爲我沒有對多個線程使用相同的上下文,我是否正確? –

+0

你說你在多個線程中操作同一個實體。這是你的競爭條件。實體也不是線程安全的(一般來說)。在所有可能的情況下,這是一種競爭狀態,源自您正在跨線程共享狀態。您需要發佈代碼以進一步分析。 – usr

+0

是的,最後我修復了這個錯誤。正如你所提到的,Context有一個多線程問題。謝謝。 –