C#多线程总结

本文深入解析C#多线程的基础概念,包括线程的创建、启动方式、常用属性以及多线程状态管理。通过具体示例展示如何使用Thread类及其委托实现多线程操作,并介绍判断线程完成工作的两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#多线程总结

1、 首先多线程启动必须包含using System.Threading;这个头文件。必须使用Thread这个类。

Thread 这个类有如下常用的属性:

对于Thread类更多:

https://msdn.microsoft.com/zh-cn/library/system.threading.thread%28v=vs.110%29.aspx

IsAlive

指示线程的当前状态(true|false)

IsBackground

指示线程是否为后台线程

Name

获取或设置线程的名字(线程默认为前台线程)

Priority

获取设置线程的优先级(其中属性值为枚举类型enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest })

任何线程创建范围内try/catch/finally块,当线程开始执行便不再与其有任何关系。

2、线程用Thread类来创建, 通过ThreadStart委托来指明方法从哪里开始运行,下面是ThreadStart委托如何定义的:

public delegate voidThreadStart();

3、启动线程的方法:有三种。

第一种:使用委托来调用要执行的函数。

//ThreadStart委托不支持传入参数

       public static void  Test1()

       {

           Thread t = new Thread(new ThreadStart(Go));

           t.Start();

           Go();

        }

       public static void Go()

       {

           Console.WriteLine(i++);

        }

第二种:直接把要调用的函数放在线程中,然后启动。

public static void Test2()

       {

           Thread t = new Thread(Go);

           t.Start();

        }

第三种:如果线程的函数比较简单可以直接写在匿名委托里。

public static void Test3()

       {

           Thread t = new Thread(delegate() { Console.WriteLine(i++); });

           t.Start();

        }

4、.NET framework定义了另一个版本的委托叫做ParameterizedThreadStart,它可以接收一个单独的object类型参数,而且这个方法的参数必须是object类型的。ParameterizedThreadStart的特性是在使用之前我们必需对我们想要的类型(这里是bool)进行装箱操作,并且它只能接收一个参数。 一个替代方案是使用一个匿名方法调用一个普通的方法

publicdelegate void ParameterizedThreadStart (object obj);

publicstatic void Test4()

        {

            Thread t = new Thread(newParameterizedThreadStart(Go1));

            t.Start(true);

            t.Priority=ThreadPriority.

            Go1(false);

           

        }

publicstatic void Go1(object b)

        {

            bool b1=(bool)b;

           Console.WriteLine(b1?"HELLO":"hello");

        }

、C# Thread类:判断多个线程是否都结束的两种方法

5、确定所有线程是否都完成了工作的方法有很多,如可以采用类似于对象计数器的方法,所谓对象计数器,就是一个对象被引用一次,这个计数器就加1,销毁引用就减1,如果引用数为0,则垃圾搜集器就会对这些引用数为0的对象进行回收。

方法一:线程计数器

线程也可以采用计数器的方法,即为所有需要监视的线程设一个线程计数器,每开始一个线程,在线程的执行方法中为这个计数器加1,如果某个线程结束(在线程执行方法的最后为这个计数器减1),为这个计数器减1。然后再开始一个线程,按着一定的时间间隔来监视这个计数器,如是棕个计数器为0,说明所有的线程都结束了。当然,也可以不用这个监视线程,而在每一个工作线程的最后(在为计数器减1的代码的后面)来监视这个计数器,也就是说,每一个工作线程在退出之前,还要负责检测这个计数器。使用这种方法不要忘了同步这个计数器变量啊,否则会产生意想不到的后果。

方法二:使用Thread.join方法

join方法只有在线程结束时才继续执行下面的语句。可以对每一个线程调用它的join方法,但要注意,这个调用要在另一个线程里,而不要在主线程,否则程序会被阻塞的。实例:

    private static void threadMethod(Objectobj) 

    { 

       Thread.Sleep(Int32.Parse(obj.ToString())); 

        Console.WriteLine(obj + "毫秒任务结束"); 

    } 

    private static void joinAllThread(objectobj) 

    { 

        Thread[] threads = obj asThread[]; 

        foreach (Thread t in threads) 

            t.Join(); 

        Console.WriteLine("所有的线程结束"); 

    } 

    

    static void Main(string[] args) 

    { 

        Thread thread1 = newThread(threadMethod); 

        Thread thread2 = newThread(threadMethod); 

        Thread thread3 = new Thread(threadMethod); 

    

         thread1.Start(3000); 

         thread2.Start(5000); 

         thread3.Start(7000); 

    

         Thread joinThread = newThread(joinAllThread); 

         joinThread.Start(new Thread[] {thread1, thread2, thread3 }); 

    

    } 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值