EF callcontext 线程释放问题

问题描述

在学习视频中发现这个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差不多这个原理,你一系列的函数调用过程中,它是存在的,但用与不用,是一回事

时间: 2024-08-02 10:11:22

EF callcontext 线程释放问题的相关文章

线程同步工具(一)控制并发访问资源

声明:本文是< Java 7 Concurrency Cookbook>的第三章, 作者: Javier Fernández González 译者:郑玉婷     控制并发访问资源 这个指南,你将学习怎样使用Java语言提供的Semaphore机制.Semaphore是一个控制访问多个共享资源的计数器. Semaphore的内容是由Edsger Dijkstra引入并在 THEOS操作系统上第一次使用. 当一个线程想要访问某个共享资源,首先,它必须获得semaphore.如果semaphor

Java线程模型缺陷研究

Java 编程语言的线程模型可能是此语言中最薄弱的部分.它完全不适合实际复杂程序的要求,而且也完全不是面向对象的.本文建议对 Java 语言进行重大修改和补充,以解决这些问题. Java 语言的线程模型是此语言的一个最难另人满意的部分.尽管 Java 语言本身就支持线程编程是件好事,但是它对线程的语法和类包的支持太少,只能适用于极小型的应用环境. 关于 Java 线程编程的大多数书籍都长篇累牍地指出了 Java 线程模型的缺陷,并提供了解决这些问题的急救包(Band-Aid/邦迪创可贴)类库.我

java学习日记(线程)

一.线程的概念: 线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制:但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈.所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程被称为轻负荷进程(light-weight process).一个进程中可以包含多个线程. 一个线程是一个程序内部的顺序控制流. 1. 进程:每个进程都有独立的代码和数据空间(进程上

Java多线程:“基础篇”06之线程让步

1. yield()介绍 yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行! 2. yield()示例 下面,通过示例查看它的用法. // YieldTest.java的源码 class ThreadA extends Thread{

Java多线程:“基础篇”05之线程等待与唤醒

wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进入 等待状态,同时,wait()也会让当前线程释放它所持有的锁.而notify()和notifyAll()的作用,则是唤 醒当前对象上的等待线程:notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程. Object类中关于等待/唤醒的API详细信息如下: notify()    

Java线程机制(三) synchronized和volatile的使用

现在开始进入线程编程中最重要的话题---数据同步,它是线程编程的核心,也是难点,就算我们理解了 数据同步的基本原理,但是我们也无法保证能够写出正确的同步代码,但基本原理是必须掌握的. 要 想理解数据同步的基本原理,首先就要明白,为什么我们要数据同步? public class CharacterDisplayCanvas extends JComponent implements CharacterListener { protected FontMetrics fm; protected ch

线程同步--使用信号量

除了使用临界区与互斥可以完成线程间的同步外,还可以使用信号量CSemaphore.使用信号量还有一个好处便是:信号允许多个线程同时使用共享资源,这便与操作系统中的PV操作有些雷同的地方.它指出了同时访问共享资源的线程最大数目. 在信号量内部有一个计数器,当有线程访问共享资源时,计数器将自动递减,当它为0时,不再允许其他线程对共享资源的访问,直到有一个线程释放共享资源,从而完成对共享资源的保护. 在建立一个信号量时必须提供一个初始化值和一个最大计数值,如: CSemaphore Semaphore

UNIX环境高级编程:线程同步之读写锁及属性

读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互斥量要么是锁住状态要么是不加锁状态,而且一次只有一个线程可以对其加锁.读写锁可以有三种状态:读模式下的加锁状态,写模式下的加锁状态,不加锁状态. 一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁. 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁(读或写

多线程编程之四——线程的同步

八.线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决.例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误:又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过. 使隶属于同一进程的各