並發和協調運行時

來源:互聯網
上載者:User

原文連結

微軟最近發布了為機器人編寫應用的新的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對象中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.