手机版

基于自定义一致生存期模型PerCallContextLifeTimeManager的问题

时间:2021-11-21 来源:互联网 编辑:宝哥软件园 浏览:

PerThreadLifetimeManager的问题使用一致内置的PerThreadLifetimeManager生存期模型时,其基于ThreadStatic的线程本地存储设计,也就是说对于每个托管的管理就绪,其会缓存已生成的对象实例。由于清除(清除的缩写)维护了托管线程池,使用过的线程并不会立即销毁,在需要的时候会继续复用。在类似ASP .NET PerCall或WCF佩尔卡尔条件下,当Call1在线程ManagedThreadId1中处理完毕后,Call2发生,而Call2很有可能也在线程ManagedThreadId1中处理。这种条件下Call2会自动复用处理Call1时生成并缓存的对象实例。如果我们希望每次调用(PerCall)都生成专用的对象实例,则PerThreadLifetimeManager在此种场景下不适合。解决办法有两种:1.继续使用PerThreadLifetimeManager模型,不适用线程池,而手动创建和销毁线程。2.自定义对象生存期模型PerCallContextLifeTimeManager复制代码代码如下:公共类peralcontextlifetime manager :生存期管理器{ private string _ key=string .格式(文化信息.不变量文化“,PercalContextlifetime manager _ { 0 }”,Guid .NewGuid());公共重写对象getVaLue(){ 0返回CallContext .GetData(_ key);}公共覆盖void SetValue(对象新值){ CallContext .SetData(_key,新值);}公共覆盖void remove value(){调用上下文.FreeNamedDataSlot(_ key);} }使用举例复制代码代码如下:私有静态void testpercocontextlifetime manager(){ IEexample;使用(国际集装箱容器=new unity container()){ container .RegisterType(typeof(IExample),typeof(Example),新的percocontextlifetime manager());集装箱ResolveIExample().sayHello();集装箱ResolveIExample().sayHello();action int action=delegate(int sleep){ container .ResolveIExample().sayHello();线程。睡眠(睡眠);集装箱ResolveIExample().sayHello();};线程1=新线程((a)=操作。调用((int)a));线程2=新线程((a)=操作。调用((int)a));线程1。开始(50);线程2。开始(55);线程1。join();线程2。join();线程池QueueUserWorkItem((a)=操作调用((int)a),50);线程池QueueUserWorkItem((a)=操作。援引((int)a),55;线程。睡眠(100);线程池QueueUserWorkItem((a)=操作调用((int)a),50);线程池QueueUserWorkItem((a)=操作。援引((int)a),55;线程。睡眠(100);线程池QueueUserWorkItem((a)=操作调用((int)a),50);线程池QueueUserWorkItem((a)=操作。援引((int)a),55;线程。睡眠(100);示例=容器ResolveIExample();}示例sayHello();控制台ReadKey();}

版权声明:基于自定义一致生存期模型PerCallContextLifeTimeManager的问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。