ThreadPool,WaitCallback,QueueUserWorkItem

來源:互聯網
上載者:User
ThreadPool 類 提供一個線程池,該線程池可用於發送工作項目、處理非同步 I/O、代表其他線程等待以及處理計時器。 許多應用程式建立的線程都要在休眠狀態中消耗大量時間,以等待事件發生。其他線程可能進入休眠狀態,只被定期喚醒以輪詢更改或更新狀態資訊。線程池通過為應用程式提供一個由系統管理的輔助線程池使您可以更為有效地使用線程。一個線程監視排到線程池的若干個等待操作的狀態。當一個等待操作完成時,線程池中的一個輔助線程就會執行對應的回呼函數。

注意 
託管線程池中的線程為後台線程,即它們的 IsBackground 屬性為 true。這意味著在所有的前台線程都已退出後,ThreadPool 線程不會讓應用程式保持運行。
 

也可以將與等待操作不相關的工作項目排列到線程池。若要請求由線程池中的一個線程來處理工作項目,請調用 QueueUserWorkItem 方法。此方法將對將被從線程池中選定的線程調用的方法或委託的引用用作參數。一個工作項目排入隊列後就無法再取消它。

計時器隊列中的計時器以及登入的等待操作也使用線程池。它們的回呼函數也會排列到線程池。

每個進程都有一個線程池。線程池的預設大小為每個可用處理器有 25 個線程。使用 SetMaxThreads 方法可以更改線程池中的線程數。每個線程使用預設的堆棧大小並按照預設的優先順序運行。 

WaitCallback 委託 表示線程池線程要執行的回調方法。WaitCallback 表示要在 ThreadPool 線程上執行的回調方法。建立委託,方法是將回調方法傳遞給 WaitCallback 建構函式。您的方法必須具有此處所顯示的簽名。

通過將 WaitCallback 委託傳遞給 ThreadPool.QueueUserWorkItem 來將任務排入隊列以便執行。您的回調方法將在某個線程池線程可用時執行。

注意 
Visual Basic 使用者可以省略 WaitCallback 建構函式,在向 QueueUserWorkItem 傳遞迴調方法時只需使用 AddressOf 運算子即可。Visual Basic 將自動調用正確的委託建構函式。
 

如果要將資訊傳遞給回調方法,請建立包含所需資訊的對象,並在將任務排入隊列以便執行時將它傳遞給 QueueUserWorkItem。每次執行您的回調方法時,state 參數都包含此對象。

有關如何使用回調同步線程池線程的更多資訊,請參見 託管線程池。

ThreadPool.QueueUserWorkItem 方法 將方法排入隊列以便執行,並指定包含該方法所用資料的對象。此方法在有線程池線程變得可用時執行。

/**//*=====================================================================
  File:      AsyncMethod.cs

  Summary:   Demonstrates thread pool usage

=====================================================================*/

using System;
using System.Threading;


class App {
   public static void Main() {
      Console.WriteLine("Main thread: Queuing an asynchronous operation.");
      AutoResetEvent asyncOpIsDone = new AutoResetEvent(false);
      ThreadPool.QueueUserWorkItem(new WaitCallback(MyAsyncOperation), asyncOpIsDone);

      Console.WriteLine("Main thread: Performing other operations.");
      // 

      Console.WriteLine("Main thread: Waiting for asynchronous operation to complete.");
      asyncOpIsDone.WaitOne();
   }


   // The callback method's signature MUST match that of a System.Threading.WaitCallback 
   // delegate (it takes an Object parameter and returns void)
   static void MyAsyncOperation(Object state) {
      Console.WriteLine("WorkItem thread: Performing asynchronous operation.");
      // 
      Thread.Sleep(5000);    // Sleep for 5 seconds to simulate doing work

      // Signal that the async operation is now complete.
       // 同步操作已經完成的操作
      ((AutoResetEvent)state).Set();
   }
}

毛毛的小窩

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.