多线程
线程(从机器的CPU角度看)一个线程是程序执行的一个单独过程。一个线程不能够被任何底层的事件中断,并且不包括执行更小的过程。
在.NET中,多线程功能是在System.Threading名称空间中定义的。因此,在使用任何线程类之前,必须定义 System.Threading名称空间。其结构图如下:
Thread类主要属性和方法
属 性
|
说 明
|
CurrentThread
|
获取当前正在运行的线程
|
IsAlive
|
获取表示当前线程执行状态的值。如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false。
|
Name
|
获取或设置线程的名称
|
Priority
|
获取或设置表示线程调度的优先级的值。Priority是一个枚举值。
(1)Highest:最高级别
(2)AboveNormal:该线程安排在Highest之后,Normal之前。
(3)Normal:该线程安排在AboveNormal之后,BelowNormal之前。默认为Normal。
(4)BelowNormal:该线程安排在Normal之后,Lowest之前。
(5)Lowest:最低级别
注意:在安排线程的优先级之前,线程的状态必须为运行。
|
ThreadState
|
获取包含当前线程的状态的值。ThreadState是一个枚举值。
|
方 法
|
说 明
|
Start()
|
使操作系统当前实例的状态更改为ThreadState.Running
|
Sleep()
|
禁止线程运行的毫秒数
|
Interrupt()
|
中止处于Sleep或Join线程状态的线程
|
Abort()
|
调用该方法终止线程
Thread类的Abort方法用于永久地杀死一个线程。但是请注意,在调用Abort方法前一定要判断线程是否被激活,也就是判断thread.IsAlive的值: if ( thread.IsAlive )
{ thread.Abort(); }
|
Join()
|
禁止调用线程,直至线程终止
|
Suppend()
|
挂起线程,如果线程已挂起,则方法无效。
Thread类的Suspend方法可以挂起一个线程。线程被挂起到调用Resume方法为止。
if (thread.ThreadState = ThreadState.Running )
{ thread.Suspend(); }
|
Resume()
|
恢复被挂起的线程。
调用Resume方法可以恢复一个被挂起的线程。如果线程没有被挂起,Resume方法就是无效的。
if (thread.ThreadState = ThreadState.Suspended )
{ thread.Resume(); }
|
创建线程语法:
Thread 线程实例名称=new Thread(new ThreadStart(方法名称))
线程同步
C#提供了锁定机制,也称线程同步。
线程同步的意思是指单独的线程执行不被其他的线程所干扰,要执行下一个线程必须等该线程结束才能进行。这样才能保证多个线程输出的一致和同步。
线程同步是确保不同的线程对共享资源(如控制台)进行协调访问的一种方法。C#中通过lock关键字提供同步。锁定机制确保每次只有一个线程访问方法或代码,除非它已经完成了对方法或代码的执行,否则其他线程就无法进行访问。当两个或两个以上的线程试图访问一个共享资源或共享文件时,这种机制尤其有用。


















































后台线程
比起应用程序的主图形用户界面(GUI)线程来说,这些线程以较低的优先权在不同的过程中运行着。对于不能立即执行结束,又不想一直等待的任务,后台线程能很好的胜任。在C#中,把线程对象的IsBackground属性设为true,该线程即为后台线程。
注意:后台线程不能直接操作所在进程之外的数据引用。
怎样与后台线程通讯?运用MethodInvoker委托实体。
要使用MethodInvoker委托,需要三个条件:
1 一个创建委托的后台线程
Thread fThread=new Thread(new ThreadStart(ThreadFunc));
fThread.IsBackground=true;
fThread.Start();
2 一个用作后台线程与前台可视化单元的接口的类级方法
public void ThreadFunc()
{
try
{
MethodInvoker mi=new MethodInvoker(this.UpdateLabel);
while(true)
{
bCounter++;
this.BeginInvok(mi);
Thread.Sleep(500);
}
}
catch(ThreadInterruptedException e)
{
Console.WriteLine("Interruption Exception in Thread:{0}",e);
}
catch(Exception we)
{
Console.WriteLine("Exception in Thread:{0}",we);
}
}
3 一个应用程序中可以更新的可视化单元
public void UpdateLabel()
{
label1.Text=bCounter.ToString();
}
后台线程源工程:http://download.youkuaiyun.com/source/369047
线程优先级示例:













































