C#多线程

来源:互联网 发布:手机淘宝排行榜在哪 编辑:程序博客网 时间:2024/05/01 03:51

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

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

                    }

                }

            }

     }

}

 

待续

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 事业人员编制在机关任职改革怎么办 老公出轨死不承认怎么办 2017年军自考毕业证怎么办 大腿酸痛肌肉萎缩怎么办一 习惯不了军训一起洗澡怎么办 脚着凉了有点痛怎么办 腿着凉了膝盖疼怎么办 下雨了脚着凉了怎么办 军训中被教官训怎么办 命根子根部长豆豆很痒怎么办? 屁股坏了化脓了怎么办 貔貅屁股摔坏了怎么办 当兵身高差4厘米怎么办 查体戴眼镜视力达不到怎么办 公司福利体检查乙肝怎么办 有乙肝每年福利体检怎么办 国企有乙肝每年福利体检怎么办 单位福利体检查乙肝怎么办 事业单位每年福利体检有乙肝怎么办 高考失利后我该怎么办 初三了科学总是考不好怎么办 初三学生三模考的不好怎么办 高考体检检查出乙肝怎么办 高考体检单丢了怎么办 小腿弯曲没发育好怎么办? 辅警考试体能测试不合格怎么办 跑步跑不动怎么办腿软 人胖跑步跑不动怎么办 不工作每天很累怎么办 电大本科文凭毕业证掉了怎么办 要求全日制本科自考本科怎么办 毕业证被学校扣了怎么办 自考本科档案没有密封怎么办 艺术生统考没过怎么办 本科科目没考过怎么办 军校体检条丢了怎么办 学美术考了大专怎么办 音基试唱音不准怎么办 音基证书丢了怎么办 职称计算机证书丢了怎么办 30岁了 开始怀旧怎么办