Multithreading 与实体框架的僵局&;林克
我有一个asp.net/mvc 3/entity framework 4.1 web应用程序,它访问类库以获取查找表数据。当我第一次访问该网站并尝试同时加载两个不同的页面时,应用程序池挂起。数据库中没有死锁或任何活动。我使用windbg/vs2010调试器查找线程锁。两个线程在Multithreading 与实体框架的僵局&;林克,multithreading,linq,entity-framework,deadlock,typedescriptor,Multithreading,Linq,Entity Framework,Deadlock,Typedescriptor,我有一个asp.net/mvc 3/entity framework 4.1 web应用程序,它访问类库以获取查找表数据。当我第一次访问该网站并尝试同时加载两个不同的页面时,应用程序池挂起。数据库中没有死锁或任何活动。我使用windbg/vs2010调试器查找线程锁。两个线程在System.Component.TypeDescriptor上锁定 执行卡在lookuptable.ToList 代码: 并行堆栈映像: 感谢您的帮助您是否有自己的锁,或者您是否在线程之间共享上下文?为什么要使用事务
System.Component.TypeDescriptor上锁定
执行卡在lookuptable.ToList
代码:
并行堆栈映像:
感谢您的帮助您是否有自己的锁,或者您是否在线程之间共享上下文?为什么要使用事务进行简单读取?除了任何设计问题(如果是查找,您可以缓存它以避免进一步读取),如果您必须(出于任何原因)在线程之间共享上下文,您应该像对待任何其他必须/不能并行执行的资源一样对待它。另外,使用transaction.complete()完成启动的事务;似乎是@user2244625中相同死锁的重复。请参见此处的MS Connect bug(投票+重新创建投票):和此处的EF问题:
Using transaction As New TransactionScope(TransactionScopeOption.RequiresNew,
New TransactionOptions() With
{.IsolationLevel = IsolationLevel.ReadUncommitted})
Using db As New Entity
Dim lookuptable = From lk In db.LookUpTable Where lk.Id = pId Select lk
returnValue = lookuptable.ToList
End Using
End Using