Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading EF 5中的多线程_Multithreading_Entity Framework - Fatal编程技术网

Multithreading EF 5中的多线程

Multithreading EF 5中的多线程,multithreading,entity-framework,Multithreading,Entity Framework,我的应用程序中有两个线程。一个线程(实际上是一个可以被另一个系统调用的web api)创建一个用于保存实体的上下文(调用savechanges()方法)。另一个线程(它是一个真正的工作线程)创建一个用于计数实体的上下文(调用count()方法)。这两个线程在同一个实体上工作。当我的应用程序运行时,有时会抛出异常。 给你,请检查一下 System.InvalidOperationException Stack: at System.Data.Entity.Internal.LazyInternal

我的应用程序中有两个线程。一个线程(实际上是一个可以被另一个系统调用的web api)创建一个用于保存实体的上下文(调用savechanges()方法)。另一个线程(它是一个真正的工作线程)创建一个用于计数实体的上下文(调用count()方法)。这两个线程在同一个实体上工作。当我的应用程序运行时,有时会抛出异常。 给你,请检查一下

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)
System.invalidoOperationException
堆栈:
在System.Data.Entity.Internal.LazyInternalContext.InitializeContext()中
位于System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(System.Type)
在System.Data.Entity.Internal.Linq.InternalSet`1[[System.\uu Canon,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]处。初始化()
在System.Data.Entity.Internal.Linq.InternalSet`1[[System.\u Canon,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]中。获取
在System.Data.Entity.Infrastructure.DbQuery`1[[System.\uu Canon,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]System.Linq.IQueryable.get\u Provider()
在System.Linq.Queryable.Count[[System.Linq.IQueryable`1,System.Linq.Expressions.Expressions`1]
位于Accela.HotDeploy.Website.Facade.DeployLogService.GetUpgradeProcess(System.Guid)

我相信这一定是线程问题造成的。对这个问题有什么想法吗?谢谢。

EF不是线程安全的。不能从多个线程中使用相同的
ObjectContext
。您甚至不能同时执行读取查询


所以你要么需要同步(使用锁),要么对不同的线程使用不同的
objectcontext

等等,你注意到我提到的每个线程都有一个新的上下文了吗。我想我没有对多个线程使用相同的上下文,对吗?你说你在多个线程中对同一实体进行操作。这是你的比赛条件。实体也不是线程安全的(一般来说)。很可能这是一种竞争条件,源于跨线程共享状态的事实。您需要发布代码进行进一步分析。是的,我最终修复了这个bug。正如您所提到的,上下文中存在多线程问题。谢谢