问题描述
在学习视频中发现这个callcontext,但这个线程是怎么释放呢///<summary>///实现对EF上下文实例进行管理,保证线程内唯一///</summary>///<returns></returns>publicstaticObjectContextGetCurrentDbContext(){//CallContext是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享。当CallContext沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。//当对另一个AppDomain中的对象进行远程方法调用时,CallContext类将生成一个与该远程调用一起传播的LogicalCallContext实例。只有公开ILogicalThreadAffinative接口并存储在CallContext中的对象被在LogicalCallContext中传播到AppDomain外部。不支持此接口的对象不在LogicalCallContext实例中与远程方法调用一起传输。ObjectContextcontext=(ObjectContext)CallContext.GetData("DbContext");if(context==null){context=newModelContainer();CallContext.SetData("DbContext",context);}returncontext;}
怎么释放这个线程内的EF实例呢???
解决方案
解决方案二:
怎么没有人回答呢。。。。
解决方案三:
EF的设计上DbContext(或者ObjectContext)就是一个短暂生命周期的对象,不应该在多处使用,而是用到了就创建,用完就销毁。所以这样子传递它很可能是误用。一般情况下也不需要自己使用CallContext,所以最好是给出一些背景说明,这样子是为了应对什么场景或需求。我能想到的唯一算得上正确的使用场景是因为性能原因,本来对一个context的使用流程被拆分到了两个或多个线程上执行,并且它们很难通过别的方式获取这个公共的context。
解决方案四:
当前线程对对象进行储存到线程本地储存区,对象随着线程的销毁而销毁。
解决方案五:
你上CSDN上看官方的这个楼CallContext官方指出它相当于一个本地对话集合,你可以想象为你这次业务处理,从调用第一个方法开始,到整个业务的结束(这中途会调用多种函数)这么一个过程,这个过程完了,它就会被销毁了。我给出个比喻,当然,我的理解并不代表一定是正确的:业务处理从方法A();开始,方法A()里同时调用了方法a1();a2();a3();,也就是说,我们从调用A()开始,就是一次会话开始,中途内部调用的a1();a2();a3();还是同样在这个会话过程中,只有当a3();完成之后,指针返回到A();最终结束了A();之后,不再有其它调用了,则认为这次会话结束。假设上面这一函数互相调用的会话过程中,CallContext这个会话集是共享的,也就是A();a1();a2();a3();共享CallContext。它就相当于seesion,每一个页面请求时生成,中途会伴随,关闭页面时会消失,seesion集本身在会话过程中是一直存在可使用的,就看你想不想用它CallContext差不多这个原理,你一系列的函数调用过程中,它是存在的,但用与不用,是一回事