您的位置:首页 > 编程语言

讲述.NET下的多线程编程在多方面使用

2012-07-26 09:01 218 查看
一:应用程序域

. 在。NET中有个特点,在。NET中有个CLR,在操作系统和我们编程环境之间有个CLR,操作系统和CLR之间有种隔离,操作系统和运行库会在应用程序间提供某种隔离,为了确保一个应用程序的代码不会对其他不相关的应用程序产生影响,这种隔离是必须的

. .NET中新增了一个隔离层称为应用程序域,它是进程内部一个逻辑独立的部分,也就是说两个进程之间为了让它们不产生一些安全性的问题,一个应用程序出现错误,不会影响其他的应用程序,举个例子:在Windows下经常有某个应用程序出错了,会弹出一个框问是否要调试,在任务栏下把出错的这个应用程序关闭就行了,说明两个进程之间它们互相是不关联的,是因为它们之间有应用程序域的原因

. 公共语言运行库可以使用应用程序域来提供应用程序间的隔离

. 应用程序域可以理解为我的地盘我做主,比如:只有一个道路的话,里面跑着大货车,私家车,行人,那么大货车出事故了是不必会影响到私家车和行人,同样它们三个中任何一个出现问题都会影响到其它的两个,因为它们在一个道路里面,那么现在假设有三个车道,快车道跑大货车的,慢车道跑私家小型车的,人行道走人的,如果大货车出现事故了,是不就不会不影响到私家车和行人,那么大货车在自己的道路里是不想怎么开就怎么开,倒着开都没事,私家车和行人同理,因为它们是在三个不同的道路里,这里三个车道相当于应用程序域,大货车和私家车以及行人相当于三个进程

. 使用应用程序域

-能够在不停止整个进程的情况下,停止某一个应用程序,一个进程中包含好多应用程序,可以把某个应用程序停止,不影响其他的应用程序

-在一个应用程序中的代码不能访问直接访问另外一个应用程序中的代码或资源

-代码的行为范围由它所运行的所在应用程序决定

-向代码授予权限可以由代码运行所在的应用程序域来决定

二:应用程序域和线程的关系

. 在运行时,所有的托管代码被加载到一个应用程序域当中,由特定的操作系统线程来运行的

. 应用程序域和线程之间不是一一对应的,也就是说,一个应用程序域可以执行多个线程,一个线程可以跨越多个应用程序域,但是在某个时间点上,某个线程还是在一个应用程序域当中的

. 通过调用Thread.GetDomain方法,可以确定线程执行所在的域

三:线程跨越多个应用程序域实例

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

namespace AppDomainAndThread

{

class Program

{

static void Main(string[] args)

{

//创建一个应用程序域

AppDomain appdomain = AppDomain.CreateDomain("MyAppDomain");

appdomain.SetData("DomainKey", "DomainValue");

CommonMethod();

//CrossAppDomainDelegate它是个委托,这个委托的作用是跨应用程序域调用的,

CrossAppDomainDelegate mydelegate = new CrossAppDomainDelegate(CommonMethod);

//AppDomain的DoCallBack方法用于跨越应用程序调用,在另外一个应用程序域中执行代码也就是我们的输出内容

appdomain.DoCallBack(mydelegate);

Console.ReadKey();

}

/// <summary>

/// 两个应用程序域都要调用的方法

/// </summary>

private static void CommonMethod()

{

//获得当前的应用程序域

AppDomain appdomain = AppDomain.CurrentDomain;

Console.WriteLine("应用程序域它的值是:'" + appdomain.GetData("DomainKey") + "' 在'" + appdomain.FriendlyName.ToString() + "'中找到的,运行的线程ID是:'" + AppDomain.GetCurrentThreadId()。ToString() + "'");

}

}

}

四:运行效果

我们发现两个应用程序域分别是"AppDomainAndThread.vshost.exe"和"MyAppDomain",它们两个的ThreadID是一样的都是5832,在两个应用程序域执行的是同一个线程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: