3

アプリケーションに2つのスレッドがあります。1つのスレッド(実際には、別のシステムから呼び出すことができるWeb APIです。)エンティティを保存するための新しいコンテキスト(savechanges()メソッドを呼び出す)。別のスレッド(実際に動作しているスレッドです。)エンティティをカウントするコンテキスト(count()メソッドを呼び出す)。これらの2つのスレッドは同じエンティティで動作しています。アプリケーションを実行すると、例外がスローされることがあります。こちらです。ご確認ください。

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)

スレッドの問題が原因であると思いましたが、この問題について何かアイデアはありますか?ありがとう。

4

1 に答える 1

1

EFはスレッドセーフではありません。ObjectContext複数のスレッドから同じものを使用することはできません。読み取りクエリを同時に実行することもできません。

したがって、同期する(ロックを使用する)か、ObjectContextsスレッドごとに異なるものを使用する必要があります。

于 2012-09-17T16:45:07.833 に答える