博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 线程的基本使用
阅读量:7071 次
发布时间:2019-06-28

本文共 5465 字,大约阅读时间需要 18 分钟。

创建线程

线程的基本操作

线程和其它常见的类一样,有着很多属性和方法,参考下表:

创建线程的方法有很多种,这里我们先从thread开始创建线程

class Program    {        static void Main(string[] args)        {            Thread t = new Thread(PrintNumbers);            t.Start();            PrintNumbers();        }        static void PrintNumbers()        {            Console.WriteLine("Starting...");            for (int i = 0; i < 10; i++)            {                Console.WriteLine(i);            }        }    }

Thread构造函数接受两种委托

public delegate void ThreadStart(); 无返回值、无参的    public delegate void ParameterizedThreadStart(object obj);无返回值、参数为object类型的方法

既然构造函数是委托那么我还可以用lambda来简写

Thread t = new Thread(()=> {                Console.WriteLine("Starting...");                for (int i = 0; i < 10; i++)                {                    Console.WriteLine(i);                }            });            t.Start();

很多时候我们都需要线程执行的是一个有参的方法,下面看看如何调用有多个参数的方法,

static void Main(string[] args)        {            int b = 10;            string c = "主线程";            Thread t = new Thread(()=> PrintNumbers(b,c));            t.Start();        }        static void PrintNumbers(int count,string name)        {            for (int i = 0; i < count; i++)            {                Console.WriteLine("name:{0},i:{1}",name,i);            }        }

Thread.Join()

我的理解是当调用Join()方法时主线程会停止工作,我不干活了,等你干完了我在继续干活如:

static void Main(string[] args)        {            Thread.CurrentThread.Name = "主线程";            Console.WriteLine("线程名字:{0},线程工作状态:{1}", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);            Thread abortThread = new Thread(AbortMethod);            abortThread.Name = "子线程";            abortThread.Start();            abortThread.Join();            Console.WriteLine("线程名字:{0},子线程工作状态:{1}", abortThread.Name, abortThread.ThreadState);            Console.WriteLine("继续干活");            Console.Read();        }        private static void AbortMethod()        {            Console.WriteLine("线程名字:{0},子线程工作状态:{1}",Thread.CurrentThread.Name,Thread.CurrentThread.ThreadState);            for (int i = 0; i < 5; i++)            {                Thread.Sleep(1000);                Console.WriteLine(i);            }        }
//输出结果
 

线程名字:主线程,线程工作状态:Running

线程名字:子线程,子线程工作状态:Running
0
1
2
3
4
线程名字:子线程,子线程工作状态:Stopped
继续干活

Thread.Abort()

Abort()方法来终止线程的运行,我们在使用它的时候要主要,它是通过抛出ThreadAbortException异常的方式来终止线程的

static void Main(string[] args)        {            Thread abortThread = new Thread(AbortMethod);            abortThread.Name = "test";            abortThread.Start();            Thread.Sleep(3000);            try            {                abortThread.Abort();            }            catch(Exception e)            {                Console.WriteLine("主线程:{0}", Thread.CurrentThread.Name);            }            Console.WriteLine("我被开除了,子线程:{0},子线程状态:{1}", abortThread.Name, abortThread.ThreadState);            Console.Read();        }        private static void AbortMethod()        {            try            {                Console.WriteLine("子线程:{0},子线程状态:{1}", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);                Console.WriteLine("开始干活");                for (int i = 0; i < 5; i++)                {                    Thread.Sleep(1000);                    Console.WriteLine(i);                }                Console.WriteLine("继续干活");            }            catch (Exception e)            {                Console.WriteLine("类型:"+e.GetType().Name);                Console.WriteLine("子线程:{0},子线程状态:{1}", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);            }        }输出子线程:test,子线程状态:Running开始干活01类型:ThreadAbortException子线程:test,子线程状态:AbortRequested我被开除了,子线程:test,子线程状态:Aborted

从运行结果可以看出,调用Abort方法的线程引发的异常类型为ThreadAbortException, 以及异常只会在 调用Abort方法的线程中发生,而不会在主线程中抛出,并且调用Abort方法后线程的状态不是立即改变为Aborted状态,而是从AbortRequested->Aborted。

Thread.ResetAbort()

Abort方法可以通过跑出ThreadAbortException异常中止线程,而使用ResetAbort方法可以取消中止线程的操作,下面通过代码演示使用 ResetAbort方法

static void Main(string[] args)        {            Thread abortThread = new Thread(AbortMethod);            abortThread.Name = "test";            abortThread.Start();            Thread.Sleep(1000);            try            {                abortThread.Abort();            }            catch(Exception e)            {                Console.WriteLine("主线程:{0}", Thread.CurrentThread.Name);            }            Console.WriteLine("我被开除了,子线程:{0},子线程状态:{1}", abortThread.Name, abortThread.ThreadState);            Console.Read();        }        private static void AbortMethod()        {            try            {                Console.WriteLine("我要被开除了");                for (int i = 0; i < 5; i++)                {                        Thread.Sleep(1000);                        Console.WriteLine(i);                }            }            catch (Exception e)            {                Thread.ResetAbort();                Console.WriteLine("类型:"+e.GetType().Name);                Console.WriteLine("子线程:{0},子线程状态:{1}", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);            }            Console.WriteLine("我又回来继续干活");        }输出我要被开除了我被开除了,子线程:test,子线程状态:AbortRequested类型:ThreadAbortException子线程:test,子线程状态:Running我又回来继续干活

线程的优先级

如果在应用程序中有多个线程在运行,但一些线程比另一些线程重要,这种情况下可以在一个进程中为不同的线程指定不同的优先级。线程的优先级可以通过Thread类Priority属性设置,Priority属性是一个ThreadPriority型枚举,列举了5个优先等级:AboveNormal、BelowNormal、Highest、Lowest、Normal。公共语言运行库默认是Normal类型的。见下图:

转载于:https://www.cnblogs.com/studydp/p/9630926.html

你可能感兴趣的文章
OSSIM系统用户审计
查看>>
如何使用Exchange邮件组仲裁
查看>>
使用Formik轻松开发更高质量的React表单(二)使用指南
查看>>
python写的部署windows下zabbix客户端脚本
查看>>
腾讯 vs 百度:两家互联网巨头对比
查看>>
数据中心的云计算之旅-【沈阳软件】2011年
查看>>
IOS7为什么遭吐槽?
查看>>
Android和.NET通用的AES算法
查看>>
Java那些事之磁盘操作
查看>>
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)...
查看>>
【学习】HTML5深入学习
查看>>
windows计数器和瓶颈
查看>>
浅谈VS编译自定义编译任务—MSBuild Task(csproject)
查看>>
推荐20个优秀的网页色彩搭配实例
查看>>
搜集点shell资料
查看>>
望江南
查看>>
P42S25C查看开机次数、时间、坏点的方法
查看>>
node.js 初体验
查看>>
Cnblogs metaweblog api link
查看>>
wcf的部署
查看>>