天天看點

01.線程

01.開啟線程

通過Thread類建立了一個線程對象,然後通過IsBackground屬性指明該線程為背景線程,如果不設定,預設為前台線程。由于前台線程執行完畢後CLR會無條件的中止背景線程的運作,是以在前面的代碼中,若是啟動了背景線程,主線程将會繼續執行。

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("前台線程ID:"+Thread.GetCurrentProcessorId());
            Thread thread=new Thread(Worker);
            thread.IsBackground = true; //是否為背景線程
            thread.Start();
            Console.ReadKey();
        }

        public static void Worker()
        {
            Console.WriteLine("背景線程ID:"+Thread.GetCurrentProcessorId());
            Thread.Sleep(2000); //線程休眠2秒
            Console.WriteLine("背景線程退出");
        }
    }      
01.線程

02.

Join()方法能保證主線程(前台線程)在異步線程thread(背景線程)運作結束後才會運作。

使用函數Join來實作,確定主線程會在背景線程結束後才開始運作

使用Join的時候,主線程會等待背景線程結束之後才能繼續執行。前面的代碼中,我們使用了Thread構造函數來建立線程對象

static  void Main(string[] args)
        {
            Thread backthread=new Thread(Worker);
            backthread.IsBackground = true; //背景線程
            backthread.Start();
            backthread.Join(); //保證背景線程完成之後調用主線程
            Thread.Sleep(1000);
            Sum();
        }

        private static void Sum()
        {
            Console.WriteLine("this is main thread" );
            Console.WriteLine("Return from Main Thread");
        } 

        private static void Worker()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Return from Worker Thread");
        }      
01.線程

03.執行帶參數的線程

static void Main(string[] args)
        {
            // 建立一個新線程(預設為前台線程) 
            //如果新線程上運作帶參數的方法,需要用到ParameterizedThreadStart委托,
            //TreadStart委托僅僅指向無參數且無傳回值的方法
            //要求隻能有一個參數,且為object類型   無傳回值
            Thread backthread = new Thread(new ParameterizedThreadStart(Worker));
            backthread.Start(111);
            Sum();
        }

        private static void Sum()
        {
            Console.WriteLine("this is main thread" );
            Console.WriteLine("Return from Main Thread");
        } 

        private static void Worker(object obj)
        {
            Thread.Sleep(2000);
            Console.WriteLine("Return from Worker Thread:"+obj);
        }