• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 基于自定义Unity生存期模型PerCallContextLifeTimeManager的问题

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了callcontext,callcontext.getdata,callcontext.setdata,context,context是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

PerThreadLifetimeManager的问题
使用Unity内置的PerThreadLifetimeManager生存期模型时,其基于ThreadStatic的TLS(Thread Local Storage)设计,也就是说对于每个托管的ManagedThreadId,其会缓存已生成的对象实例。

由于CLR维护了托管线程池,使用过的线程并不会立即销毁,在需要的时候会继续复用。在类似ASP.NET PerCall或WCF PerCall条件下,当Call1在线程ManagedThreadId1中处理完毕后,Call2发生,而Call2很有可能也在线程ManagedThreadId1中处理。这种条件下Call2会自动复用处理Call1时生成并缓存的对象实例。

如果我们希望每次调用(PerCall)都生成专用的对象实例,则PerThreadLifetimeManager在此种场景下不适合。

解决办法有两种:

1.继续使用PerThreadLifetimeManager模型,不适用ThreadPool,而手动创建和销毁线程。
2.自定义对象生存期模型
PerCallContextLifeTimeManager

      public override object GetValue()
      {
        return CallContext.GetData(_key);
      }

      public override void SetValue(object newValue)
      {
        CallContext.SetData(_key, newValue);
      }

      public override void RemoveValue()
      {
        CallContext.FreeNamedDataSlot(_key);
      }
    }
</div>
使用举例

        container.Resolve<IExample>().SayHello();
        container.Resolve<IExample>().SayHello();

        Action<int> action = delegate(int sleep)
        {
          container.Resolve<IExample>().SayHello();
          Thread.Sleep(sleep);
          container.Resolve<IExample>().SayHello();
        };

        Thread thread1 = new Thread((a) => action.Invoke((int)a));
        Thread thread2 = new Thread((a) => action.Invoke((int)a));
        thread1.Start(50);
        thread2.Start(55);
        thread1.Join();
        thread2.Join();

        ThreadPool.QueueUserWorkItem((a) => action.Invoke((int)a), 50);
        ThreadPool.QueueUserWorkItem((a) => action.Invoke((int)a), 55);
        Thread.Sleep(100);

        ThreadPool.QueueUserWorkItem((a) => action.Invoke((int)a), 50);
        ThreadPool.QueueUserWorkItem((a) => action.Invoke((int)a), 55);
        Thread.Sleep(100);

        ThreadPool.QueueUserWorkItem((a) => action.Invoke((int)a), 50);
        ThreadPool.QueueUserWorkItem((a) => action.Invoke((int)a), 55);
        Thread.Sleep(100);

        example = container.Resolve<IExample>();
      }

      example.SayHello();

      Console.ReadKey();
    }</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 基于自定义Unity生存期模型PerCallContextLifeTimeManager的问题

相关文章

  • 2017-05-11关于Asp.net页面Page_Load被执行两次的问题分享
  • 2017-05-11ASP.NET 页面传值常用方法总结
  • 2017-05-11ASP.NET中DataTable与DataSet之间的转换示例
  • 2017-05-11CHECKBOX 的全选、取消及跨页保存的实现方法
  • 2017-05-11详解ASP.NET MVC之下拉框绑定四种方式
  • 2017-05-11asp.net web页面元素的多语言化(多国语化)实现分享
  • 2017-05-11.NET中函数Main的使用技巧
  • 2018-08-20EntityFramework 6.x学习之多个上下文迁移实现分布式事务详解
  • 2017-05-11.NET Core Windows环境安装配置教程
  • 2017-05-11asp.net和ajax实现智能搜索功能代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • list泛型自定义排序示例
    • asp.net 页面版文本框智能提示JSCode (升级版)
    • DataGridView自动调整行高和行宽
    • Ajax+asp.net智能匹配检索(含图含完整代码)
    • ASP.NET Core使用SkiaSharp实现验证码的示例代码
    • ASP.NET搭配Ajax实现搜索提示功能
    • .net core2.0下使用Identity改用dapper存储数据(实例讲解)
    • 获取远程网页的内容之二(downmoon原创)
    • .net MVC使用Session验证用户登录(4)
    • VS2012/VS2013本地发布网站步骤详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有