线程的使用

单线程

单线程,就是只有一个线程。系统为应用程序分配一个主线程,该线程执行程序中以Main方法开始和结束的代码。

多线程

1.多线程的优点:要提高对用户的响应速度并且处理所需数据,以便几乎同时完成工作。

单个应用程序域可以使用多线程完成以下任务:

1).通过网络与Web服务器和数据库进行通信。

2).执行占用大量时间操作。

3).区分具有不同优先级的任务。

4).使用户界面可以在将时间分配给后台任务时仍能快速做出响应。

2.多线程的缺点

增加操作系统资源的使用,降低性能。

使用多线程,可能会产生如下问题:

1).系统将为进程、AppDomain对象和线程所需的上下文信息使用内存。因此,可以创建的进程、AppDomain对象和线程的数目会受到可用内存的限制。

2).跟踪大量的线程将占用大量的处理器时间。如果线程过多,则其中大多数线程都不会产生明显的进度。如果大多数当前线程处于一个进程中,则其他进程中的线程的调度频率就会很低。

3).使用许多线程控制代码执行非常复杂,并且可能产生许多bug。

4).销毁线程需要了解可能发生的问题并对这些问题进行处理。

3.Thread类

Thread类主要用于创建并控制线程、设置线程优先级并获取其状态。

1).Thread类的常用属性及说明

ApartmentState:获取或设置该线程的单元状态

CurrentContext:获取线程正在其中执行的当前上下文

CurrentThread:获取当前正在运行的线程

IsAlive:获取当前线程的执行状态

ManagedThreadId:获取当前托管线程的唯一标识符

Name:获取或设置线程的名称

Priority:获取线程的调度优先级

ThreadState:获取当前线程的状态

2).Thread类的常用方法及说明

Abort:终止线程

GetApartmentState:返回一个ApartmentState值,指示单元状态。

GetDomain:返回当前线程正在其中运行的当前域

Interrupt:中断处于WaitSleepJoin线程状态的线程

Join:阻止调用线程,直到某个线程终止时为止

ResetAbort:取消为当前线程请求的Abort

Resume:继续已挂起的线程

SetApartmentState:在线程启动前是指其单元状态

Sleep:将当前线程阻止指定的毫秒数

SpinWait:导致线程等待由iterations参数定义的时间量

Start:使线程被安排进行执行

Suspent:挂起线程,或者如果线程已挂起,则不起作用

VolatileRead:读取字段值。

VolatileWrite:立即向字段写入一个值。

3).创建线程

static void Main(string [] args)

{

Thread myThread = new Thread(new ThreadStart(CreateThread));

myThread.Start();

}

public static void CreateThread()

{

Console.Write(“创建线程”);

}

4).线程的挂起与恢复

static void Main(string [] args)

{

Thread myThread = new Thread(new ThreadStart(CreateThread));

myThread.Start();

myThread.Suspend();       //挂起线程

myThread.Resume();       //恢复挂起线程

}

public static void CreateThread()

{

Console.Write(“线程实例”);

}

5).线程休眠

将当前线程阻止指定的时间。

a).public static void Sleep(int millSecondsTimeout)

b).public static void Sleep(TimeSpan timeout)

6).终止线程

a).Abort方法

线程的Abrot方法用于永久地停止托管线程。

static void Main(string [] args)

{

Thread myThread = new Thread(new ThreadStart(CreateThread));

myThread.Start();

myThread.Abort();  //终止线程

}

public static void CreateThread()

{

Console.Write(“线程实例”);

}

b).Join方法

Join方法用来阻止调用线程,直到某个线程终止为止。

static void Main(string [] args)

{

Thread myThread = new Thread(new ThreadStart(CreateThread));

myThread.Start();

myThread.Join();      //

}

public static void CreateThread()

{

Console.Write(“线程实例”);

}

7).线程优先级

线程的优先级值:AbroveNormal,BlowNormal,Highest,Lowest,Normal

static void Main(string[] args)

{

Thread thread1 = new Thread(new ThreadStart(Thread1));

thread1.Priority = ThreadPriority.Lowest;

Thread thread2 = new Thread(new ThreadStart(Thread2));

thread1.Start();

thread2.Start();

}

Static void Thread1()

{

Console.WriteLine(“线程一”);

}

Static void Thread2()

{

Console.WriteLine(“线程二”);

}

8).线程同步

线程同步时指并发线程高效、有序地访问共享资源所采用的技术,所谓同步,是指某一时刻只有一个线程可以访问资源,只有当资源所有者主动放弃了代码或资源的所有权时,其他线程才可以使用这些资源。

a).使用C#中lock关键字实现线程同步

statci void Main(string[] args)

{

Program myProgram = new Program();

myProgram.LockThread();

}

void LockThread()

{

lock(this)

{

Console.WriteLine(“锁定线程以实现线程同步”);

}

}

b).使用Monitor类实现线程同步

Monitor类提供了同步对象的访问机制,它通过向单个线程授予对象锁来控制对对象的访问,对象锁提供限制访问代码块的能力。当一个线程拥有对象锁时,其他任何线程都不能获取该锁。

Monitor类的常用方法及说明

Enter:在指定对象上获取排他锁

Exit:释放指定对象上的排他锁

Pulse:通知等待队列上的线程锁定对象状态的更改

PulseAll:通知所有的等待线程对象状态的更改

TryEnter:试图获取指定对象的排他锁

Wait:释放对象上的锁并阻止当前的线程,直到它重新获取该锁

statci void Main(string[] args)

{

Program myProgram = new Program();

myProgram.LockThread();

}

void LockThread()

{

Monitor.Enter(this);//锁定当前线程

Console.WriteLine(“锁定线程以实现线程同步”);

Monitor.Exit(this);//释放当前线程

}

c).使用Mutex类实现线程同步

statci void Main(string[] args)

{

Program myProgram = new Program();

myProgram.LockThread();

}

void LockThread()

{

Mutex myMutex = new Mutex(false);

myMutex.WaitOne();//阻止当前线程

Console.WriteLine(“锁定线程以实现线程同步”);

myMutex.ReleaseMutex();//释放Mutex对象

}

《C#从入门到精通》读后总结

原文地址:https://www.cnblogs.com/hmliang/p/5400904.html