C#多线程

线程是程序中独立的指令流。

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);

                    }

                }

            }

     }

}

 

待续

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值