VB.net学习笔记(二十四)线程基础
Imports System.AppDomain Public Class MyAppDomain Dim Domain As AppDomain '应用程序域,它是一个应用程序在其中执行的独立环境。 此类不能被继承 Public Sub SetDomainData(ByVal name As String,ByVal value As String) '为指定的应用程序域属性分配指定值 Domain.SetData(name,CType(value,Object)) 'name 要创建或更改的用户定义应用程序域属性的名称(String) 'data 属性的值(Object) End Sub Public Function GetDomainData(ByVal name As String) As String '为指定名称获取存储在当前应用程序域中的值 Return Domain.GetData(name) 'name 预定义应用程序域属性的名称,或已定义的应用程序域属性的名称(String) End Function Public Shared Sub Main() Console.WriteLine("检索当前应用程序域...") Dim Obj As New MyAppDomain() Dim DataName As String,DataValue As String Obj.Domain = CurrentDomain '获取当前 Thread 的当前应用程序域 DataName = "MyData" DataValue = "Some Data To be stored" Console.WriteLine("设置应用程序域数据...") Obj.SetDomainData(DataName,DataValue) Console.WriteLine("获取应用程序域数据...") Console.WriteLine("The Data found for key '" & DataName & "' is '" & Obj.GetDomainData(DataName) & "' running on thread id: " & Threading.Thread.CurrentThread.ManagedThreadId.ToString) Console.ReadLine() End Sub End Class 3.在指定的应用程序域中执行代码 例:在新近创建的AppDomain中创建线程时的有关行为。 Imports System.AppDomain Public Class CreateAppDomain Public Shared Sub Main() Dim DomainA As AppDomain,DomainB As AppDomain Dim stringA As String = "DomainA Value" Dim stringB As String = "DomainB Value" DomainA = CreateDomain("MyDomainA") '使用指定的名称新建应用程序域 DomainB = CreateDomain("MyDomainB") DomainA.SetData("DomainKey",stringA) DomainB.SetData("DomainKey",stringB) CommonCallBack() '1 'DoCallBack(callBackDelegate As CrossAppDomainDelegate) '在另一个应用程序域中执行代码,该应用程序域由指定的委托标识 'callBackDelegate 指定要调用的方法的委托 DomainA.DoCallBack(AddressOf CommonCallBack) '2 DomainB.DoCallBack(AddressOf CommonCallBack) '3 Console.ReadLine() End Sub Shared Sub CommonCallBack() Dim Domain As AppDomain = CurrentDomain '当前应用程序域 Console.WriteLine("The Value '" & Domain.GetData("DomainKey") & "' was found in " & Domain.FriendlyName & "running on thread id:" & Threading.Thread.CurrentThread.ManagedThreadId.ToString) End Sub End Class说明:第一排应用程序域名的值为空,是因为当前应用程序域无DomainKey,name有系统预定义名,如Domain.GetData("APP_NAME")是应用程序的名称。 三排中得出的线程ID号都是9,说明AppDomain可以有零个或多个线程,更重要的是—个线程能够跨越不同的域来执行。 (二)线程管理 .NETFramework提供自由线程和逻辑应用程序域的功能,还提供处理器线程类(System.Threading.Thread)。 受托管的线程与 Windows线程(http://kb.cnblogs.com/page/68545/) 必须要了解,执行.NET应用的线程实际上仍然是Windows线程。但是,当某个线程被CLR所知时,我们将它称为受托管的线程。具体来说,由受托管的代码创建出来的线程就是受托管的线程。如果一个线程由非托管的代码所创建,那么它就是非托管的线程。不过,一旦该线程执行了受托管的代码它就变成了受托管的线程。 一个受托管的线程和非托管的线程的区别在于,CLR将创建一个System.Threading.Thread类的实例来代表并操作前者。在内部实现中,CLR将一个包含了所有受托管线程的列表保存在一个叫做ThreadStore地方。 CLR确保每一个受托管的线程在任意时刻都在一个AppDomain中执行,但是这并不代表一个线程将永远处在一个AppDomain中,它可以随着时间的推移转到其他的AppDomain中。 从安全的角度来看,一个受托管的线程的主用户与底层的非托管线程中的Windows主用户是无关的。 .NET运行库监控着由.NET代码创建的所有线程,它还监控着所有非托管线程.这些非托管线程可能执行了托管代码。因为托管代码可以由随时可用的COM包装器提供,所以非托管线程能够很好地在.NET运行库中工作。 当非托管代码确实在托管线程中执行时,运行库就会检查TLS以査明是否存在一个托管Thread对象。如果发现了一个托管线程,运行库就会使用那个线程。如果没有发现托管线程,则运行库就会创建一个并使用它。这个过程非常简单,却非常必要。无论线程来自何处我们仍旧想得到它的一个对象表示。如果运行库不为这些类型的内部调用管埋和创建线程的话,那么我们就不能在托管环境中标识线程,甚至是控制它。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |