c#进程和线程学习笔记

一、基本概念

1、进程:进程是系统资源分配和资源调度的基本单位,每个独立执行的程序在系统中都是一个进程。如qq、word都是一个进程。

2、线程:线程是进程中的执行流程,一个进程中可以包含多个线程,每个线程也可以得到一个小段程序的执行时间。

二、线程管理

1、启动线程

Thread t1=new Thread(方法名);//创建一个线程
t1.Start();//启动该线程

2、线程休眠

多线程中,为了使某个线程暂停一段时间

Thread.Sleep(5000);//当前线程暂停5s

3、合并线程

join方法用于把指定的线程合并到当前线程。如果一个线程T1在执行过程中需要等待另个一个线程T2结束后才能继续执行。

Thread t1=new Thread(port1);//创建一个线程t1
t1.Start();//启动该线程

Thread t2=new Thread(port2);//创建一个线程t2
t2.Start();//启动该线程

void port1()
{
     t2.Join();//中断线程1,执行线程2,等待线程2终止,线程1才能继续执行
}

void port1()
{

}

 4、线程终止

if(t1.ThreadState==ThreadState.Running)//判断线程是否在执行
{
   t1=Abort();//终止线程
}

5、线程的优先级

在多任务操作系统中,每个线程都会得到一小段CPU时间片进行执行,在时间结束时,将轮换另一个线程进入执行状态,这时会选择与当前线程优先级相同的进程进行执行。

如优先级下   :

线程5:线程A和线程B 

线程4:线程C

...

线程1:线程D

执行过程:优先级为5的线程A首先的得到CPU时间片,当改时间结束后,轮换到与线程A相同优先级的线程B,当线程B的运行时间结束后,会继续轮换到线程A,当线程A和线程B 都执行完后,才会轮到执行线程B.

Thread t1=new Thread(port1);//创建一个线程t1
t1.Priority= ThreadPriority.Lowest;//设置优先级最低
t1.Start();//启动该线程

Thread t2=new Thread(port2);//创建一个线程t2
t2.Priority= ThreadPriority.Highest;//设置优先级最高
t2.Start();//启动该线程

6、线程同步机制

为了防止多线程中,发送两个线程抢占资源的问题,引入线程同步机制,线性同步指并发线程高效、有序的访问执行,所谓同步,是指某一时刻只有一个线程可以访问资源,只有资源所拥有者放弃了代码或资源的拥有权时,其他线程才可以使用这些资源。

(1)使用lock关键字实现线程同步

lock关键字可以用来确保代码完成运行,而不被其它线程中断。

Object thisLock =new Object();
lock(thisLock)//参数必须基于引用类型对象
{
  //要运行的代码块
}

(2)使用monitor类实现线程同步

monitor类提供了通过向单个线程授予对象来控制对对象的访问,当一个线程拥有对象锁时,其它任何线程都不能获取该所。

Monitor.Enter(obj);//锁定代码块
{
        //所要执行的代码块
}
Monitor.Exit(obj);//解锁代码块

三、线程参数传递

上面中创建的线程都不带参数,下面讨论如何传递参数。

参考:C# 多线程参数传递

1、通过实体类传递

 //需要执行的线程
 public class FunctionClass  
    {  
        public static string TestFunction(string name, int age)  
        {   
            return name + " 的年龄是:" + age;  
        }  
    }  

//新建实体类
public class TransitionalClass  
    {  
        private string name = string.Empty;  
        private int age;  
        public string acceptResults = string.Empty;  
        public TransitionalClass(string name, int age)  
        {  
            this.name = name;  
            this.age = age;  
        }  
  
        public void TestFunction()  
        {  
            acceptResults = FunctionClass.TestFunction(this.name, this.age);  
        }  
    }

//执行线程
 //实例化ThreadWithState类,为线程提供参数    
          TransitionalClass tc = new TransitionalClass(" Jack", 42);  
          // 创建执行任务的线程,并执行    
          Thread t = new Thread(new ThreadStart(tc.TestFunction));  
          t.Start();  
          //获取返回值,通过 tc.acceptResults;    

猜你喜欢

转载自blog.csdn.net/kenjianqi1647/article/details/82901569