Refresh-air

清风明月本无价 近水远山皆有情
记载自己在码砖过程中遇到的点点滴滴.......

 

C#多线程的学习(一)

一、线程的定义

1.多任务

多任务这个术语是指操作系统一次运行多个应用程序的能力。使用同步技术可以解决抢先式多任务的相关问题。

2.进程

内存和资源的物理分离叫做进程,一个应用程序可以启动多个进程,分配给进程的内存与为其他进程分配的内存被隔离,只有所属的那个进程才可以访问它。每个进程都有自己独立的数据、执行代码和系统资源。

3.线程

进程有一个由计算机的处理器使用的执行次序,这个执行次序就称为线程,进程由寄存器定义,记录CPU的使用情况、线程使用的堆栈以及跟踪线程当前状态的容器,这个容器就叫做线程本地存储区(Thread Local Storage)

3.1 单线程的进程

每个进程至少包括一个执行线程,创建一个进程包括在指令中的某一点启动进程,这个最初的线程称为基本线程或主线程。线程的实际执行顺序是由应用程序中的方法代码来决定的。

3.2 时间片

3.3 多线程的进程

可以将进程分解,以共享分配给它的时间片,通过在进程中产生额外的执行线程,就可以分解进程,产生一个额外的线程来完成后台的工作,这些辅助线程称为工作线程(Worker thread),这些线程将共享进程的内存空间(这些内存空间与系统上的其他进程隔离开来),这些在进程中产生的新线程就称为自由线程。

二、.Net和C#对线程的支持(支持自由线程)

2.1 System.AppDomain类

.Net新增了一个隔离层,称为应用程序域或AppDomain,应用程序域不像进程那样是一个物理独立的部分,而是进程内部的一个逻辑独立部分,在一个进程中可以存在多个应用程序域。应用程序域与线程也有直接的关系,他们可以保持一个或多个线程,就像进程一样,不同之处在于,应用程序域可以在进程内部创建,但不创建新线程。应用程序域和进程以及线程的关系如下图:

 

2.2 设置AppDomain数据

 

代码
public class MyAppDomain
    {
        
public AppDomain domain;
        
public int ThreadID;

        
public void SetDomainData(string vName, string vValue)
        {
            domain.SetData(vName, vValue); 
            ThreadID 
= AppDomain.GetCurrentThreadId();
        }

        
public string GetDomainData(string name)
        {
            
return (string)domain.GetData(name);
        }
        
static void Main()
        {
            
string dataName = "MyData";
            
string dataValue = "Some Data to be stored";
            Console.WriteLine(
"Retrieving current domain");
            MyAppDomain obj 
= new MyAppDomain();
            obj.domain 
= AppDomain.CurrentDomain;

            Console.WriteLine(
"Setting domain data");
            obj.SetDomainData(dataName, dataValue);

            Console.WriteLine(
"Getting domain data");
                 Console.WriteLine(
"The Data found for key" + dataName + "is" +
                     obj.GetDomainData(dataName) 
+ " running on thread id:" +obj.ThreadID);
        }
    }

 

 

2.3在指定的应用程序域中执行代码

 

代码
class Program
    {
        
static void Main(string[] args)
        {
            AppDomain DomainA;
            DomainA 
= AppDomain.CreateDomain("DomainA");
            
string StringA = "DomainA Value";
            DomainA.SetData(
"DomainKey", StringA);
            CommonCallBack();
            CrossAppDomainDelegate delegateA 
= new CrossAppDomainDelegate(CommonCallBack);
            DomainA.DoCallBack(delegateA);
        }
        
public static void CommonCallBack()
        {
            AppDomain Domain;
            Domain 
= AppDomain.CurrentDomain;
            Console.WriteLine(
"The value'" + Domain.GetData("DomainKey"
                
+ "' was found in " + Domain.FriendlyName 
                
+ " running on thread id :" 
                
+ AppDomain.GetCurrentThreadId().ToString());
        }
    }

 

 

2.4 线程管理与.Net运行库

  .Net不仅提供了对自由线程的进程和逻辑应用程序域的支持,还提供了处理器线程的对象表示,这些对象表示都是在System.Threading.Thread类的实例。
  .Net运行库监控着由.Net代码创建的所有线程。它还监控着所有可以执行托管代码的非托管线程。

posted on 2010-04-25 14:44  笑清风  阅读(269)  评论(0编辑  收藏  举报

导航