博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程、应用程序域、线程的相互关系
阅读量:5298 次
发布时间:2019-06-14

本文共 2219 字,大约阅读时间需要 7 分钟。

 

 

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}\tAppDomainID 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}\tAppDomainID 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}\tContextID is:{1}",
Thread.CurrentThread.ManagedThreadId, Thread.CurrentContext.ContextID);
Console.WriteLine(message);
}
}

运行结果

 

进程(Process)、线程(Thread)、应用程序域(AppDomain)、上下文(Context)的关系如下图,一个进程内可以包括多个应用程序域,也有包括多个线程,线程也可以穿梭于多个应用程序域当中。但在同一个时刻,线程只会处于一个应用程序域内。线程也能穿梭于多个上下文当中,进行对象的调用。

虽然进程、应用程序域与上下文在平常的开发中并非经常用到,但深入地了解三者的关系,熟悉其操作方式对合理利用系统的资源,提高系统的效率是非常有意义的。尤其是三者与线程之间的关系尤为重要,特别是在一个多线程系统中,如果不能理清其关系而盲目使用多线程,容易造成资源抢占与死锁之类的错误。

 

 

 

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

 

转载于:https://www.cnblogs.com/chuizilong/p/10179692.html

你可能感兴趣的文章
全栈12期的崛起之捡点儿有用的说说
查看>>
属性动画
查看>>
标识符
查看>>
路由跟踪工具0trace
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
boost库使用:vs2013下boost::container::vector编译出错解决
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
快来熟练使用 Mac 编程
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>
驱动的本质
查看>>