首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#多线程开发一:使用Thread类创建与启动线程

2013-10-08 
C#多线程开发1:使用Thread类创建与启动线程C#中,可以使用Thread类来处理(包含创建,启动,挂起,恢复,终止等

C#多线程开发1:使用Thread类创建与启动线程

C#中,可以使用Thread类来处理(包含创建,启动,挂起,恢复,终止等操作)线程。本文将介绍如何使用Thread类来创建与启动新线程。

Thread类类位于System.Threading命名空间中。

1、线程创建与启动

实例化一个Thread对象,就创建了一个新的线程。

线程创建后调用Start()方法便可以启动新线程。

下面给出一个使用Thread类创建和启动新线程的实例。

文章一开始,给出实例的完整代码,如下:

//完整的示例代码//求和方法static void CalcSum(){    long sum = 0;    for (long i = 0; i < 1000000000; i++)    {        sum += i;        if (i % 100000000 == 0 && i!=0)        {            Console.WriteLine("workThread-->i={0}:sum={1}",i,sum);        }    }}//求差方法static void CalcGap(){    long gap = 0;    for (long i = 1000000000; i >=0 ; i--)    {         gap = i-1;         if (i % 100000000 == 0 && i != 0)         {             Console.WriteLine("MainThread-->i={0}:gap={1}", i, gap);         }    }}static void Main(string[] args){                      ThreadStart entry = new ThreadStart(CalcSum);//求和方法被定义为工作线程入口    Thread workThread = new Thread(entry);    workThread.Start();    CalcGap();//求差方法被主线程调用}

在实例中,定义了两个方法,一个求和方法(CalcSum)和一个求差方法(CalcGap)。

求差方法在Main函数中被调用,这个很容易被看出,不做过多解释。

那么实例中的求和方法被谁调用了呢?回答这个问题前,我们需要对Thread类的实例化操作做个简单的说明。

Thread类在实例化时,需要给其构造函数传入一个参数,用于指定线程开始执行的方法(线程入口)。我们查看Thread类的定义,发现其构造函数有以下重载形式:

C#多线程开发一:使用Thread类创建与启动线程

在这里,我们使用下面这个构造函数来实例化Thread对象(其他构造函数的使用会在后续博文中介绍):

public Thread(ThreadStart start);

该构造函数接受一个ThreadStart 类型的入参。

查看ThreadStart 类型的定义,如下:

public delegate void ThreadStart();

通过阅读定义,我们了解到,ThreadStart是一个委托类型,该委托类型封装的方法没有入参也没有返回值。

ThreadStart委托类型的定义同样位于System.Threading命名空间中。

到这里,我们可以简单总结一下Thread对象的实例化过程,包含以下步骤:

    定义一个包含了要执行代码的方法,同时该方法必须具有和ThreadStart委托类型相同的签名(没有入参也没有返回值);创建ThreadStart委托类型的委托实例;实例化Thread对象,且将ThreadStart的委托实例作为入参传入Thread类的构造函数。

    在本例中的求和方法与 ThreadStart委托类型具有相同的签名,且包含线程需要执行的操作,所以用它来创建ThreadStart委托的委托实例。

    再将ThreadStart委托实例作为参数传入Thread构造函数实例化Thread对象。这样就可以告诉编译器线程入口为求和方法CalcSum()。一旦启动线程就会执行这个求和方法指定的操作序列。

    实例化Thread对象代码如下:

    ThreadStart entry = new ThreadStart(CalcSum);Thread workThread = new Thread(entry);static void CalcSum(){    //do what you want   }

    Thread类型的实例化也可以使用下面的形式来完成:

    Thread workThread = new Thread(new ThreadStart(CalcSum));

    本例中,传送给Thread类型构造函数的参数是ThreadStart类型的委托。其实,我们也可以采用匿名方法来完成前面Thread类的实例化操作,具体代码如下:

    Thread workThread = new Thread(delegate(){    long sum = 0;    for (long i = 0; i < 1000000000; i++)    {         sum += i;         if (i % 100000000 == 0 && i != 0)         {              Console.WriteLine("workThread-->i={0}:sum={1}", i, sum);         }     }});

    或者:

    Thread workThread = new Thread(delegate(){     CalcSum();});

    接下来,启动线程,代码如下:

    workThread.Start();

    代码中的求差方法被Main函数调用,在主线程中被执行。

    而求和方法作为工作线程workThread的入口,被工作线程调用。

    这里给出两个方法主要是为了说明,此时确实存在两个线程在执行。

    至于代码其他细节,这里不做过多解释,有兴趣的可以一探究竟,执行结果如下所示。

    C#多线程开发一:使用Thread类创建与启动线程

    就到这里了,C#多线程开发一:使用Thread类创建与启动线程

     

热点排行