zoukankan      html  css  js  c++  java
  • 进程、应用程序域、线程的相互关系

    4.1 跨AppDomain的线程

    线程存在于进程当中,它在不同的时刻可以运行于多个不同的AppDomain当中。它是进程中的基本执行单元,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时 系统就会自动创建一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。
    关于线程的介绍,可参考 “C#综合揭秘——细说多线程(上)”、“C#综合揭秘——细说多线程(下)”

    下面的例子将介绍一下如何跨AppDomain使用线程。

    static void Main(string[] args)
    {
    var message = string.Format(" CurrentThreadID is:{0} AppDomainID is:{1}",
    Thread.CurrentThread.ManagedThreadId, AppDomain.CurrentDomain.Id);
    Console.WriteLine(message);
    Console.Read();
    }

    然后再新建一个ConsoleApplication项目,在此项目中新一个AppDomain对象,在新的AppDomain中通过ExecuteAssembly方法执行Example.exe程序。
    static void Main(string[] args)
    {
    //当前应用程序域信息
    Console.WriteLine("CurrentAppDomain start!");
    ShowMessage();

    //建立新的应用程序域对象
    AppDomain newAppDomain = AppDomain.CreateDomain("newAppDomain");
    //在新的应用程序域中执行Example.exe
    newAppDomain.ExecuteAssembly("Example.exe");

    AppDomain.Unload(newAppDomain);
    Console.ReadKey();
    }

    public static void ShowMessage()
    {
    var message = string.Format(" CurrentThreadID is:{0} AppDomainID is:{1}",
    Thread.CurrentThread.ManagedThreadId, AppDomain.CurrentDomain.Id);
    Console.WriteLine(message);
    }

    运行结果

    可见,ID等于10的线程在不同时间内分别运行于AppDomain 1与AppDomain 2当中。

    4.2 跨上下文的线程
    线程既然能够跨越AppDomain的边界,当然也能跨越不同的上下文。 下面这个例子中,线程将同时运行在默认上下文与提供安全线程的上下文中

    class Program
    {
    [Synchronization]
    public class ContextBound : ContextBoundObject
    {
    public void Test()
    {
    ShowMessage();
    }
    }

    static void Main(string[] args)
    {
    //当前应用程序域信息
    Console.WriteLine("CurrentAppDomain start!");
    ShowMessage();

    //在上下文绑定对象中运行线程
    ContextBound contextBound = new ContextBound();
    contextBound.Test();
    Console.ReadKey();
    }

    public static void ShowMessage()
    {
    var message = string.Format(" CurrentThreadID is:{0} ContextID is:{1}",
    Thread.CurrentThread.ManagedThreadId, Thread.CurrentContext.ContextID);
    Console.WriteLine(message);
    }
    }

    运行结果

    进程(Process)、线程(Thread)、应用程序域(AppDomain)、上下文(Context)的关系如下图,一个进程内可以包括多个应用程序域,也有包括多个线程,线程也可以穿梭于多个应用程序域当中。但在同一个时刻,线程只会处于一个应用程序域内。线程也能穿梭于多个上下文当中,进行对象的调用。
    虽然进程、应用程序域与上下文在平常的开发中并非经常用到,但深入地了解三者的关系,熟悉其操作方式对合理利用系统的资源,提高系统的效率是非常有意义的。 尤其是三者与线程之间的关系尤为重要,特别是在一个多线程系统中,如果不能理清其关系而盲目使用多线程,容易造成资源抢占与死锁之类的错误。

    作者太难了给作者点辛苦费吧

  • 相关阅读:
    CodeForces 660D Number of Parallelograms
    【POJ 1082】 Calendar Game
    【POJ 2352】 Stars
    【POJ 2481】 Cows
    【POJ 1733】 Parity Game
    【NOI 2002】 银河英雄传说
    【NOI 2015】 程序自动分析
    【POJ 1704】 Georgia and Bob
    【HDU 2176】 取(m堆)石子游戏
    【SDOI 2016】 排列计数
  • 原文地址:https://www.cnblogs.com/chuizilong/p/10179692.html
Copyright © 2011-2022 走看看