菜单

C# 二十多线程之Thread类

2019年5月16日 - 皇家赌场系统

应用System.Threading.Thread类能够创建和调整线程。

[]

三种办法:1种是利用带ParameterizedThreadStart委托的措施参数构造Thread;另1种是创办一个自定义类,把线程的艺术定义为实例方法,那样先开端化实例的多寡,在开发银行线程。

   参见:

ThreadStart委托定义了一个赶回类型位void的无参数方法。

        public void Main()
        {
            Thread vThread = new Thread(ThreadFun);
            //vThread.Name = "td_Name";  // 线程名称
            vThread.Start(); //开始执行线程
            Console.WriteLine("This is the main thread:id=" + Thread.CurrentThread.ManagedThreadId);
        }

        void ThreadFun() // 来自委托:ThreadStart 
        {
            Console.WriteLine("Running in a new thread:id=" + Thread.CurrentThread.ManagedThreadId);
            for (int i = 0; i < 10; i++)
            {
                Console.Write(".");
                Thread.Sleep(500);
            }
            Console.WriteLine("THREAD END");
        }

   
使用Thread.Sleep()方法,会使线程处于WaitSleepJoin状态,在经验Sleep()方法定义的年月段后,线程就能够等待再一次被操作系统调节。

出口结果:

如:传递参数

        public void Main()
        {
            Thread vThread = new Thread(() =>
            {
                Console.WriteLine("New thread started");  // Title3
                Thread.Sleep(5000);
                Console.WriteLine("New thread completed"); // Title2
            });
            //vThread.IsBackground = true;
            vThread.Start();
            Console.WriteLine("This is the main thread"); // Title1
        }

 五.调节线程

    要停下2个线程,能够调用 Thread.Abort()
方法。调用那个格局,会在接到终止命令的线程中抛出3个ThreadAbortException,用贰个管理程序捕获那么些那个,线程能够在告竣前达成部分清管事人业。线程还是能在收受到调用
Thread.Abort() 方法的结果 ThreadAbortException
万分后持续专门的学业。尽管线程未有重新初始化终止,接收到终止请求的线程的图景就从
AbortRequested 改为 Aborted 。

1. 无参数创设线程 

 

常用的构造函数有:

        public void Main()
        {
            TdData tData = new TdData() { Message = "Thread Info" };
            TdHelper tHelper = new TdHelper(tData); // 传递参数
            Thread vThread = new Thread(tHelper.ThreadFun);
            vThread.Start();
            Console.WriteLine("This is the main thread");
        }
        // 摘要: 
        //     初始化 System.Threading.Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。
        //
        // 参数: 
        //   start:
        //     System.Threading.ParameterizedThreadStart 委托,它表示此线程开始执行时要调用的方法。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     start 为 null。
        [SecuritySafeCritical]
        public Thread(ParameterizedThreadStart start);
        //
        // 摘要: 
        //     初始化 System.Threading.Thread 类的新实例。
        //
        // 参数: 
        //   start:
        //     System.Threading.ThreadStart 委托,它表示此线程开始执行时要调用的方法。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     start 参数为 null。
        [SecuritySafeCritical]
        public Thread(ThreadStart start);

 

将上诉代码中的 ThreadFun() 用拉姆da表明式替换,形成Thread的地利使用方式:

能够经过安装Thread类实例的IsBackground属性,来让其变为后台线程; 

        public void Main()
        {
            Thread vThread = new Thread(() =>
            {
                Console.WriteLine("Running in a new thread");
            });
            //vThread.Name = "td_Name";  // 线程名称
            vThread.Start(); //开始执行线程
            Console.WriteLine("This is the main thread");
        }
        public void Main()
        {
            TdData tData = new TdData() { Message = "Thread Info" };
            Thread vThread = new Thread(ThreadFun);
            vThread.Start(tData);   // 开始执行线程,传递参数
            Console.WriteLine("This is the main thread");
        }

        void ThreadFun(object pObj) // 来自委托:ParameterizedThreadStart 
        {
            TdData vData = (TdData)pObj;
            Console.WriteLine("In a new thread, Received:{0}", vData.Message);            
        }

  
通过Priority属性,能够调解Thread类实例的优先级,默以为: vThread.Priority
= ThreadPriority.Normal; // 枚举值

 使用第3种办法:先自定义3个类。

 

暗许处境下,Thread类创造的线程事前台线程,线程池中的线程总是后台线程。只要有2个前台线程在运维,应用程序的长河就在运维,假诺四个前台线程在运转,而Main()方法结束了,应用程序还是事激活的,直到全体前台线程完结职分。

  关系:Highest > AboveNormal > Normal > BelowNormal >
Lowest

    public class TdHelper
    {
        public TdData mData; // 传递数据

        // 构造函数
        public TdHelper(TdData pData)
        {
            this.mData = pData;
        }

        public void ThreadFun() // 来自委托:ThreadStart 
        {
            Console.WriteLine("In a new thread, TdDataMessage:{0}", mData.Message);
        }
    }

     然后,在主线程(须要的地方)创立Thread并将实例方法TdHelper.ThreadFun()作为构造函数的参数。

 二.给线程传递参数

 当IsBackground属性默以为false时,能够在调整台完整地来看 3句输出音讯;但假使将其设为true时,则差异到第壹条音信(Title2)输出时,主线程Main()已经实施到位,调控台窗口就活动关闭了。

 

图片 1

动用第贰种艺术:

    
调用Thread对象的Start()方法,能够创设线程。不过,在调用Start()方法后,新线程仍不是高居
Running 状态,而是 Unstarted
状态。唯有操作系统的线程调治器采纳了要运转该线程,线程就能改为 Running
状态。通过 Thread.ThreadState 属性,能够拿走该线程当前的情形。

        public struct TdData // 传递数据
        {
            public string Message;  //数据string字段
        }

    倘若要等待线程甘休,就足以调用 Thread.Join()
方法,它会终止当前线程,并把它设置为 WaitSleepJoin
状态,直到参加的线程完结甘休。

三.后台线程

4.线程的事先级

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图