熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.NET下的多線程編程應用程序域

2022-06-13   來源: .NET編程 

  一應用程序域
   
    NET中有個特點NET中有個CLR在操作系統和我們編程環境之間有個CLR操作系統和CLR之間有種隔離操作系統和運行庫會在應用程序間提供某種隔離為了確保一個應用程序的代碼不會對其他不相關的應用程序產生影響這種隔離是必須的
   
    NET中新增了一個隔離層稱為應用程序域它是進程內部一個邏輯獨立的部分也就是說兩個進程之間為了讓它們不產生一些安全性的問題一個應用程序出現錯誤不會影響其他的應用程序舉個例子在Windows下經常有某個應用程序出錯了會彈出一個框問是否要調試在任務欄下把出錯的這個應用程序關閉就行了說明兩個進程之間它們互相是不關聯的是因為它們之間有應用程序域的原因
   
    公共語言運行庫可以使用應用程序域來提供應用程序間的隔離
   
    應用程序域可以理解為我的地盤我做主比如只有一個道路的話裡面跑著大貨車私家車行人那麼大貨車出事故了是不必會影響到私家車和行人同樣它們三個中任何一個出現問題都會影響到其它的兩個因為它們在一個道路裡面那麼現在假設有三個車道快車道跑大貨車的慢車道跑私家小型車的人行道走人的如果大貨車出現事故了是不就不會不影響到私家車和行人那麼大貨車在自己的道路裡是不想怎麼開就怎麼開倒著開都沒事私家車和行人同理因為它們是在三個不同的道路裡這裡三個車道相當於應用程序域大貨車和私家車以及行人相當於三個進程
   
    使用應用程序域
   
    能夠在不停止整個進程的情況下停止某一個應用程序一個進程中包含好多應用程序可以把某個應用程序停止不影響其他的應用程序
   
    在一個應用程序中的代碼不能訪問直接訪問另外一個應用程序中的代碼或資源
   
    代碼的行為范圍由它所運行的所在應用程序決定
   
    向代碼授予權限可以由代碼運行所在的應用程序域來決定
   
    二應用程序域和線程的關系
   
    在運行時所有的托管代碼被加載到一個應用程序域當中由特定的操作系統線程來運行的
   
    應用程序域和線程之間不是一一對應的也就是說一個應用程序域可以執行多個線程一個線程可以跨越多個應用程序域但是在某個時間點上某個線程還是在一個應用程序域當中的
   
    通過調用ThreadGetDomain方法可以確定線程執行所在的域
   
    三線程跨越多個應用程序域實例
   
    using System;
   
    using SystemCollectionsGeneric;
   
    using SystemLinq;
   
    using SystemText;
   
    using SystemThreading;
   
    namespace AppDomainAndThread
   
    {
   
    class Program
   
    {
   
    static void Main(string[] args)
   
    {
   
    //創建一個應用程序域
   
    AppDomain appdomain = AppDomainCreateDomain(MyAppDomain
   
    appdomainSetData(DomainKey DomainValue
   
    CommonMethod()
   
    //CrossAppDomainDelegate它是個委托這個委托的作用是跨應用程序域調用的

  CrossAppDomainDelegate mydelegate = new CrossAppDomainDelegate(CommonMethod)
   
    //AppDomain的DoCallBack方法用於跨越應用程序調用在另外一個應用程序域中執行代碼也就是我們的輸出內容
   
    appdomainDoCallBack(mydelegate)
   
    ConsoleReadKey()
   
    }
   
    /// <summary>
   
    /// 兩個應用程序域都要調用的方法
   
    /// </summary>
   
    private static void CommonMethod()
   
    {
   
    //獲得當前的應用程序域
   
    AppDomain appdomain = AppDomainCurrentDomain;
   
    ConsoleWriteLine(應用程序域它的值是 + appdomainGetData(DomainKey) + + appdomainFriendlyNameToString() + 中找到的運行的線程ID是 + AppDomainGetCurrentThreadId()ToString() +
   
    }
   
    }
   
    }
   
    四運行效果
   
    我們發現兩個應用程序域分別是AppDomainAndThreadvshostexeMyAppDomain它們兩個的ThreadID是一樣的都是在兩個應用程序域執行的是同一個線程

  \ 


From:http://tw.wingwit.com/Article/program/net/201311/12077.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.