[C#] 執行緒 (ThreadPool)(二)

  • 37553
  • 0
  • 2009-12-20

[C#] 執行緒 (ThreadPool)(二)

Introduction

這邊介紹 ThreadPool 類別,可以幫助有效的管理執行緒的資源,一昧的增加執行緒物件,若沒有有效的管理,

有時會變成程式的負擔。

其中 ThreadPool.QueueUserWorkItem 方法,可以幫使用者的工作排入執行緒的管佇列,由 ThreadPool 對其做

管理,分配執行此方法的執行緒個體。

下面是方法的原型:


public static bool QueueUserWorkItem(
    WaitCallback callBack
)

public static bool QueueUserWorkItem(
    WaitCallback callBack,
    Object state
)
參數
callBack
型別:System.Threading..::.WaitCallback

WaitCallback,表示要執行的方法。

state
型別:System..::.Object

物件,含方法所需的資料。

 

Example

sample1

執行緒的分配,皆由 ThreadPool 類別決定,建立新執行緒去作業,還是配置已經回收的執行緒去作業。


using System.Threading;

namespace TestThreadPool {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("以下開始將工作排入執行緒管理工作佇列 !!");
            Console.WriteLine("***********************************************");

            for (int n1 = 0; n1 < 3; n1++) {
                //建立 WaitCallback 物件,並且指定回呼方法
                WaitCallback myWaitCallback = new WaitCallback(WorkA);
                //將 WaitCallback 排入排程
                ThreadPool.QueueUserWorkItem(myWaitCallback, n1 + 1);
                //使畫面慢慢輸出
                Thread.Sleep(1000);
            }

            Console.WriteLine("*********************************************");

            for (int n1 = 0; n1 < 3; n1++) {
                ThreadPool.QueueUserWorkItem(new WaitCallback(WorkB), n1 + 1);
                Thread.Sleep(1000);
            }

            Console.WriteLine("***********************************");

            for (int n1 = 0; n1 < 3; n1++) {
                ThreadPool.QueueUserWorkItem(new WaitCallback(WorkC), n1 + 1);
                Thread.Sleep(1000);
            }
            Console.ReadLine();
        }

        public static void WorkA(object o) {
            string Name;
            //取得執行緒的雜湊碼
            Name = "使用的執行緒編號 Thread ID# = " + Thread.CurrentThread.GetHashCode();
            Console.WriteLine
              ("這是第一組被排入佇列的第 {0} 個工作,{1}", o, Name);
            Console.WriteLine("此工作執行緒結束 !! ");

        }

        public static void WorkB(object o) {
            string Name;
            Name = "使用的執行緒編號 Thread ID# = " +
              Thread.CurrentThread.GetHashCode();
            Console.WriteLine
              ("這是第二組被排入佇列的第 {0} 個工作,{1}", o, Name);
            Console.WriteLine("此工作執行緒暫停 2 秒 !! ");
            Thread.Sleep(2000);
        }

        public static void WorkC(object o) {
            string Name;
            Name = "使用的執行緒編號 Thread ID# = " +
              Thread.CurrentThread.GetHashCode();
            Console.WriteLine
              ("這是第三組被排入佇列的第 {0} 個工作,{1}", o, Name);
            Console.WriteLine("此工作執行緒暫停 10 秒 !! ");
            Thread.Sleep(10000);
        }
    }

 

 

輸出結果

2009-12-20_025958

 

Refrence

三小俠  小弟獻醜,歡迎指教