激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 基于自定義Unity生存期模型PerCallContextLifeTimeManager的問題

基于自定義Unity生存期模型PerCallContextLifeTimeManager的問題

2019-11-03 19:13asp.net教程網 ASP.NET教程

本篇文章小編將為大家介紹,基于自定義Unity生存期模型PerCallContextLifeTimeManager的問題。需要的朋友參考下

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 class PerCallContextLifeTimeManager : LifetimeManager
    {
      private string _key = 
        string.Format(CultureInfo.InvariantCulture, 
        "PerCallContextLifeTimeManager_{0}", Guid.NewGuid());

 

      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);
      }
    }


使用舉例

復制代碼代碼如下:


private static void TestPerCallContextLifeTimeManager()
    {
      IExample example;
      using (IUnityContainer container = new UnityContainer())
      {
        container.RegisterType(typeof(IExample), typeof(Example),
          new PerCallContextLifeTimeManager());

 

        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();
    }

 

基于自定義Unity生存期模型PerCallContextLifeTimeManager的問題

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 中文字幕在线观看视频www | 99国语露脸久久精品国产ktv | 艹逼| 久久精品视频1 | 精品一区二区三区免费视频 | 欧美成人一区免费视频 | 欧美成人一区二区三区 | 在线播放免费av | 男人午夜小视频 | 91亚洲精品一区二区福利 | 黄色网址在线免费播放 | 日韩视频精品一区 | 色婷婷久久一区二区 | 精品国产一区二区在线 | 看免费黄色大片 | 国产美女视频一区 | freexxxx性女hd性吃奶 | www.91sp| av电影免费播放 | 亚洲成人免费网站 | 欧美一级α | 久久精品无码一区二区三区 | 4480午夜 | 国产亚洲自拍一区 | 特级毛片全部免费播放器 | 中文字幕 日本 | 免费在线观看国产精品 | 国产精品成人久久 | 免费永久看羞羞片网站入口 | 成人羞羞视频在线观看 | 久久久久久久国产视频 | 91快色视频 | 欧美黄成人免费网站大全 | 九九夜夜 | 激情网站视频 | 性生活视频一级 | 亚洲第一视频 | 俄罗斯论理片 | 一级片999| 日日天日日夜日日摸 | 成片免费观看视频大全 |