原文連結
微軟最近發布了為機器人編寫應用的新的Microsoft Robotics Studio的預覽版。這些新的工具很有趣,但是它應該比僅僅為機器人編程更加有趣。
Dispatcher類
當你的應用程式初始化的時候,你首先希望構造一個Dispatcher對象來管理一組線程。它實際上是一個線程池。和CLR的線程池一樣,這些線程調用方法(通過delegate)來執行任務:
public sealed class Dispatcher : IDisposable { public Dispatcher(); public Dispatcher(Int32 threadCount, String threadPoolName); public Dispatcher(Int32 threadCount, ThreadPriority priority, String threadPoolName); public ICollection<DispatcherQueue> DispatcherQueues { get; } ... // Other members not shown}
當你構造Dispatcher對象時,可以把你想要的線程數傳遞給建構函式。在預設情況下,Dispatcher為每個CPU建立一個線程。注意,一個Dipatcher對象建立的線程數量是固定的,Dispatcher沒有動態建立或者銷毀線程的邏輯。和CLR線程池不同,沒有用來定期檢查工作負載並動態調整線程池中線程數量的的特殊線程。這簡化了Dispatcher線程池邏輯,並且使它更加高效。
當構造一個Dispatcher的時候,你還可以設定線程調度的優先順序。預設情況下線程的優先順序為普通。你還可以設定Dispatcher建立的線程的名稱,當Dispatcher內部建立線程時,它會將線程對象的Name屬性賦值為你設定的名字。這個名字可以協助你進行調試,當你在Visual Studio中調試的時候還可以線上程視窗中看到它。
不像CLR中全域唯一的線程池,CCR允許你通過建立多個Dispatcher對象來建立多個線程池。這還使得你可以為不同類型的任務建立不同的線程池,如果你需要的話,還可以為每個線程池設定不同的優先順序。
DispatcherQueue類
在你建立了一個Dispatcher之後,你將希望建立一個DispatcherQueue對象。一個DispatcherQueue維護了一個準備執行的delegate的隊列。Dispatcher的線程等待有元素出現在DispatcherQueue中。通常DispatcherQueue是空的,並且Dispatcher的線程處於等待狀態。當有元素出現時,Dispatcher線程蘇醒,並且行該元素對應的方法。
public sealed class DispatcherQueue : IDisposable { // Use CLR thread pool; not Dispatcher public DispatcherQueue(string name); public DispatcherQueue(String name, Dispatcher dispatcher); public virtual void Enqueue(ITask task); public virtual void EnqueueTimer( TimeSpan timeSpan, Port<DateTime> timerPort); public void Dispose(); ... // Other members not shown}
對於CLR的線程池,如果有1000個元素在排隊,當這1000個元素被處理完之前你沒有辦法讓一個新的元素被處理。但是在CCR中,你可以分配一個DispatcherQueue給大多數的工作項目,同時分配另外一個DispatcherQueue對象給高優先順序的工作項目。Dispatcher對象輪循所有與之關聯的DispatcherQueue,並從中取出元素。我還需要指出,如果在DispatcherQueue的建構函式中不帶Dispatcher參數將可能會建立一個使用CLR線程池而不是Dispatcher的DispatcherQueue對象。
通常情況下,應用程式在初始化的時候構造Dispatcher和DispatcherQueue對象,並在程式餘下的生命週期中使用它們。所以,現在我們把注意力轉到那些應用程式常常構造、使用一小段時間然後就廢棄的對象上。
Port和Arbiter類
一個泛型的Port<T>對象代表一個隊列,隊列中所有的元素類型都是T。你可以認為port是一種回呼函數的參數隊列,類似於ThreadPool.QueueUserWorkItem方法的state參數。
當非同步作業完成,它的結果會投遞到一個Port對象中。