文章出處

一、多線程介紹

C#通過多線程支持并行執行的代碼。一個線程是一個獨立執行的路徑,可以同時與其他線程一起運行。一個C#客戶端程序(Console,WPF,Winows Forms)開始于一個單獨的線程,該線程由CLR和操作系統自動地創建,我們稱它為主線程,而且可以通過創建附加的線程來實現多線程。

二、初探

1.創建第一個多線程程序

2.打開visual studio 2015。新建一個控制臺應用程序ThreadConsoleApp。如下圖。

3.此項目使用.net framework 4.5.2。

 

4.代碼如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; //引入線程 

namespace ThreadConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建一個線程來運行PrintNumber,當我們構造一個線程時,ThreadStart或ParameterizedThreadStart實例委托會傳給構造函數
            //我們只需要指定不同線程需要運行的方法名,如下所示。編譯器會自動在后臺創建這些對象。
            Thread t = new Thread(PrintNumber);
            //啟動線程
            t.Start();
            PrintNumber();
            Console.Read();   

        } 

        static void PrintNumber()
        {
            Console.WriteLine("第一個多線程程序開始。。。。");
            for (int i = 0; i <20; i++)
            {
                long time = DateTime.Now.Ticks;
                Console.WriteLine(string.Format("Ticks:{0} ==  {1}",time,i));
            }

        }
    }
}

 5.程序運行結果如下

 

從上圖的結果圖中可以看出來,兩組范圍為20的數字是隨機交替出現的,說明PrintNumber方法即運行在主線程中,又運行中子線程中。

 

三、暫停線程(Sleep)

1.代碼如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; //引入線程 

namespace ThreadConsoleApp
{
    class Program
    {

        static void Main(string[] args)
        {
            Thread t = new Thread(PrintNumberDely);
            //啟動線程
            t.Start();
            PrintNumber();
            Console.Read();         

        } 

        static void PrintNumber()
        {
            Console.WriteLine("第一個多線程程序開始。。。。Second:" + DateTime.Now.Second);
            for (int i = 0; i <10; i++)
            {
                Console.WriteLine(string.Format("{0}",i));
            }
        }

        /// <summary>
        /// 暫停2秒的方法
        /// </summary>
        static void PrintNumberDely()
        {
            Console.WriteLine("第一個多線程暫停程序開始。。。。");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(string.Format("Second:{0} ==  {1}", DateTime.Now.Second, i));
                Thread.Sleep(TimeSpan.FromSeconds(2));        

            }
        }
    }
}

 2.結果如下。

 

                                                        圖1

 

                                                                   圖2

看結果圖,如上面2圖。當程序運行時,創建一個子線程運行PrintNumberDely()方法,然后執行PrintNumber,但是由于PrintNumberDely方法中存在暫停代碼,所以每隔2秒才打印一個數字。

 

四、線程等待(Join)

1.代碼如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; //引入線程 

namespace ThreadConsoleApp
{

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("開始");
            Thread t = new Thread(PrintNumberDely);
            //啟動線程
            t.Start();
            //線程等待
            t.Join();
            Console.WriteLine("結束");
            Console.Read();
           

        } 

  

        /// <summary>
        /// 暫停2秒的方法
        /// </summary>
        static void PrintNumberDely()
        {
            Console.WriteLine("第一個多線程等待程序開始。。。。");

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(string.Format("Second:{0} ==  {1}", DateTime.Now.Second, i));
                Thread.Sleep(TimeSpan.FromSeconds(2));         
              
            }
        }
    }
}

 

 2.程序運行結果如下圖。

 

 看結果圖,當程序運行時,創建一個子線程運行PrintNumberDely()方法,但是由于我們調用了t.join()方法,所以主線程就會阻塞,直到子線程執行完畢,主線程才會繼續執行,最后打印出“結束”。使用此技術,可以實現兩個線程的同步執行,第一個線程等另一個線程執行完畢,才繼續執行。


注釋join()方法,程序的運行結果如上圖。請自行比較兩個結果的區別。

 

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()