线程是程序中独立的指令流。
C#中线程是使用Thread类来处理的,该类在System.Threading命名空间中。一个Thread实例标识一个线程,即执行序列。实例化一个Thread对象,就可以创建另一个线程。
示例:
void ChangeColorDepth()
{
//processing to change color depth of image
}
//entryPoint has been declared previously as delegate
//of type ThreadStart
ThreadStart entryPoint = new ThreadStart(ChangeColorDepth);
Thread depthChangeThread = new Thread(entryPoint);
depthChangeThread.Name = "DepthChange Thread" ;
depthChangeThread.Start();
//注意:因为线程入口点(本例中是ChangeColorDepth())不能带任何参数,所以必须采用其他方式,给方法传送需要的信息。最明显的方式是使用这个方法所属的类的成员字段。除了不能带参数之外,该方法还不能返回信息。(返回值返回到什么地方?如果这个方法有返回值,运行它的线程就会终止,所以根本接收不到返回值,也不可能把值返回给调用它的线程,因为那时线程在忙着干其他事)
因此.net framework2.0引入了新特性,引入了匿名方法,就不比创建一个独立的方法,而可以把方法的代码块直接放在委托声明中。
void ChangeColorDepth()
{
Thread DepthChangeThread = new Thread(delegate()
{
//processing to change color depth of image
});
}
如果需要挂起线程,需要在主线程中使用
depthChangeThread.Suspend();
恢复线程
depthChangeThread.Resume();
取消
depthChangeThread.Abort();
如果后续的处理依赖于另一个已经终止的线程,可以调用Join方法等待线程终止
depthChangeThread.Join();
获得当前线程
Thread myOwnThread = Thread.CurrentThread;
线程的优先级有:Highest、AboveNormal、Normal、BelowNormal、Lowest
设置线程优先级:
workerThread.Priority = ThreadPriority.AboveNormal
同步:
使用线程的一个重要方面是同步访问多个线程访问的任何变量。所谓同步,是指在某一时刻只有一个线程可以访问变量。
C#为同步访问遍历提供了一个非常简单的方式,lock
用法如下:
lock(x)
{
DoSomething();
}
使用ThreadPool创建线程
CLR 包含一个内置的线程池,供应用程序使用,这个线程池可以通过ThreadPool类访问。
ThreadPool类会在线程的托管池中重用已有的线程。使用完线程后,线程就会返回线程池,供以后使用
在达到如下目标时,应使用ThreadPool类
1、要以最简单的方式创建和删除线程
2、应用程序使用线程的性能要优先考虑
在达到如下目标时,应使用Thread类:
1、要控制所创建线程的优先级
2、希望所使用的线程维护其标识,该标识要与线程一起进行各种操作,经过许多不同的时间段
3、所使用的线程的寿命较长
线程池示例:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static int interval ;
static void Main(string[]args)
{
Console.Write("Interval to display results at?>");
interval=int.Parse(Console.ReadLine());
ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod));
Thread.Sleep(100);
ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod));
Console.ReadLine();
}
static void StartMethod(Object stateInfo)
{
DisplayNumbers("Thread " + DateTime.Now.Millisecond.ToString());
Console.WriteLine("Thread Finished");
}
static void DisplayNumbers(string GivenThreadName)
{
Console.WriteLine( "Starting thread: " + GivenThreadName );
for( int i=1;i<=8*interval;i++ )
{
if(i%interval==0)
{
Console.WriteLine("Count has reached "+i );
Thread.Sleep(1000);
}
}
}
}
}
待续