日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

.NET简谈组件程序设计之(上下文与同步域)

發(fā)布時(shí)間:2023/12/10 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET简谈组件程序设计之(上下文与同步域) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們繼續(xù)學(xué)習(xí).NET多線程技術(shù),這篇文章的內(nèi)容可能有點(diǎn)復(fù)雜。在打破常理之后,換一種新的思考模型最為頭疼。這篇文章里面會(huì)涉及到一些不太常見(jiàn)的概念,比如:上下文、同步域等等。我也是最近才接觸這些關(guān)于組件編程方面的高深技術(shù),大家一起學(xué)習(xí),再大的困難也是有時(shí)間限制的,只要我們堅(jiān)持。

在本人的上一篇文章“.NET簡(jiǎn)談組件程序設(shè)計(jì)之(多線程與并發(fā)管理一)”中,只是初步的帶領(lǐng)我們學(xué)習(xí)一下關(guān)于多線程的一些基本的原理,包括線程切換,線程的開(kāi)始、執(zhí)行、等待、結(jié)束。

這篇文章的重點(diǎn)是學(xué)習(xí)關(guān)于線程的同步、互斥的機(jī)制。在多線程的應(yīng)用程序中,最少會(huì)有一個(gè)主線程在運(yùn)行著,如果我們想提高應(yīng)用程序的吞吐量就必須借助多線程的原理來(lái)實(shí)現(xiàn)。[王清培版權(quán)所有,轉(zhuǎn)載請(qǐng)給出署名]

.NET上下文(ContextBoundObject對(duì)象)

什么叫上下文,千萬(wàn)別和ASP.NET中的上下文搞混了,這個(gè)上下文是個(gè)形容詞,在不同的場(chǎng)合有不同的意思。在ASP.NET中的上下文是指Context對(duì)象,這個(gè)對(duì)象基本上包容了HTTP協(xié)議的整個(gè)生命周期的信息,可以獲取到客戶端瀏覽器的一些基本信息,也可以獲取到關(guān)于HTTP協(xié)議的一些信息,等等。

這里所講的上下文是.NET程序執(zhí)行的最小邏輯范圍,ASP.NET上下文是站在B/S編程模型角度去看待的,而這里的上下文是站在.NET底層運(yùn)行角度看來(lái)的,后者是代碼的上下文,前者是整個(gè)生命周期的上下文。

在沒(méi)有接觸ContextBoundObject之前我一直以為.NET程序執(zhí)行的最小邏輯范圍是應(yīng)用程序域(AppDomain),知道了之后才知道另有隱情,上下文是用來(lái)確定對(duì)象的邏輯歸屬,在多線程(Thread)、事物處理(Transaction)、企業(yè)服務(wù)(Enterprise)等方面都需要用上下文來(lái)對(duì)對(duì)象進(jìn)行規(guī)劃。下面您將看到怎么用上下文來(lái)進(jìn)行線程的同步的。

圖1:

.NET同步域(Synchronization特性)

同步域的概念是來(lái)源于多線程的場(chǎng)合,在我們進(jìn)行多線程操作的時(shí)候,讓很多個(gè)線程去同時(shí)訪問(wèn)一個(gè)內(nèi)存對(duì)象的時(shí)候,是必須用鎖來(lái)保證只有一個(gè)線程進(jìn)入對(duì)象操作的,那么同步域的概念就是同步的是一個(gè)區(qū)域,而不是單單的一個(gè)對(duì)象。

線程是代碼的執(zhí)行路徑,只要在這條執(zhí)行路徑上都屬于線程的范圍,那么怎么在執(zhí)行的路徑中分離出另外一個(gè)同步區(qū)域。[王清培版權(quán)所有,轉(zhuǎn)載請(qǐng)給出署名]

臨界資源是系統(tǒng)中對(duì)同一時(shí)間只能由一個(gè)線程進(jìn)行訪問(wèn)的描述。我們假設(shè)自己就是一個(gè)線程,我們要去家里拿點(diǎn)東西,那么門就是線程的同步鎖,當(dāng)我們進(jìn)去的時(shí)候就把門從里面反鎖,出去的時(shí)候就把門打開(kāi),以方便自己的家人進(jìn)來(lái)。這個(gè)房子就是臨界資源。可能這樣的描述不太靠譜,哪有這樣的家啊!

圖2:

利用上下文和同步域進(jìn)行線程的同步

下面我們將結(jié)合上下文和同步域的原理進(jìn)行線程的同步。請(qǐng)看一段代碼:

  • using?System; ?
  • using?System.Collections.Generic; ?
  • using?System.Text; ?
  • using?System.Threading; ?
  • using?System.Runtime.Remoting; ?
  • using?System.Runtime.Remoting.Contexts; ?
  • ?
  • namespace?ConsoleApplication1.多線程和并發(fā)管理 ?
  • { ?
  • ????//如果不加上下文,那么就是以對(duì)象為線程鎖定區(qū)域,如果加上下文,那么就是已邏輯上下文為鎖定區(qū)域 ?
  • ????[Synchronization(SynchronizationAttribute.REQUIRED,?true)]//重新進(jìn)入同步域 ?
  • ????public?class?MyClass?:?ContextBoundObject ?
  • ????{ ?
  • ????????public?void?DoWork() ?
  • ????????{ ?
  • ?
  • ????????????int?i?=?0; ?
  • ????????????while?(true) ?
  • ????????????{ ?
  • ????????????????Console.WriteLine(Thread.CurrentThread.ManagedThreadId?+?"|"?+?i++); ?
  • ????????????????if?(i?==?10) ?
  • ????????????????{ ?
  • ????????????????????Console.WriteLine("---------------------------------------------"); ?
  • ????????????????????Console.Read(); ?
  • ????????????????????break; ?
  • ????????????????} ?
  • ????????????} ?
  • ?
  • ????????} ?
  • ????} ?
  • } ?
  • 在這段代碼里面,我給Myclass類加上了Synchronization特性,并且繼承自上下文對(duì)象ContextBoundObject。兩者必須集合使用,同步域只有在上下文中才有效。

    【MSDN:將?SynchronizationAttribute?應(yīng)用到一個(gè)上下文綁定對(duì)象會(huì)導(dǎo)致創(chuàng)建等待句柄和自動(dòng)重置事件,這些內(nèi)容不一定會(huì)被作為垃圾來(lái)回收。因此,不要在很短的時(shí)間內(nèi)創(chuàng)建大量用?SynchronizationAttribute?標(biāo)記的上下文綁定對(duì)象。】

    圖3:

    ?

    圖4:

    我們來(lái)看調(diào)用代碼:

  • Thread?currentthread?=?Thread.CurrentThread; ?
  • ????????????Console.WriteLine(currentthread.Name?+?currentthread.ManagedThreadId); ?
  • ?
  • ????????????MyClass?myclass?=?new?MyClass(); ?
  • ?
  • ????????????Thread?thread?=?new?Thread(new?ThreadStart(myclass.DoWork)); ?
  • ?
  • ?
  • ????????????Thread?thread2?=?new?Thread(new?ThreadStart(myclass.DoWork)); ?
  • ????????????thread2.Start(); ?
  • ????????????thread.Start(); ?
  • ?
  • ????????????thread2.Join(); ?
  • ????????????thread.Join(); ?
  • ????????????Console.WriteLine(currentthread.Name?+?currentthread.ManagedThreadId); ?
  • ????????????Console.Read();?
  • 圖5:

    我為了方便截圖所以把循環(huán)的數(shù)字設(shè)的比較小,如果你想測(cè)試一下,可以把數(shù)字設(shè)的大一點(diǎn)。[王清培版權(quán)所有,轉(zhuǎn)載請(qǐng)給出署名]

    在SynchronizationAttribute對(duì)象里面有幾個(gè)枚舉值,是用來(lái)確定是否共享一個(gè)同步域的,有興趣的可以自己嘗試,我就不在這里多講了。

    總結(jié):同步域和上下文對(duì)象是線程自動(dòng)同步的好方法,但是他鎖定的目標(biāo)太大,難免導(dǎo)致系統(tǒng)的吞吐量下降,所以下面幾篇文章我們將會(huì)學(xué)習(xí)怎么使用手動(dòng)同步來(lái)實(shí)現(xiàn)更靈活的同步(Monitor、WaitHandler等),從很小的粒度進(jìn)行鎖定。






    ?本文轉(zhuǎn)自 王清培 51CTO博客,原文鏈接:http://blog.51cto.com/wangqingpei557/652057,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者


    總結(jié)

    以上是生活随笔為你收集整理的.NET简谈组件程序设计之(上下文与同步域)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。