2011-09-12 43 views
0

我正在研究C#編程對語言的相當磨合。我想我認爲我對通常的面向對象編程有很好的理解,並且運行多線程意味着高層次的實現,但實際上我稱之爲scrub。如何爲C#中的類創建「後臺打印」服務

我正在做的是創建一個工具,它將有許多線程獨立運行並互相交互,每個線程都可以爲自己的任務服務並可以調用其他任務。

我的策略是確保通信(不會丟失同時發生於不同線程的多個更新),每個類都創建一個類似spool的任務,可以調用外部任務,並將任務添加到給定線程或spool服務對於這些。我不確定是否應該將它放在課程或外部,並讓課程本身將新卷軸稱爲新任務並跟蹤卷軸。在這裏,我特別考慮如果一個空線軸得到一個任務時,如何給這個班發信號(監聽者的方法,如果他們想要在新東西到達時喚醒,任務可以預訂池),或者「如果每隔X秒檢查一次的任務和下一個任務不計劃「方法

什麼是一個好的策略來創建這個,我應該創建在實際的類,或外部?實施過程中的關鍵區域是什麼?因爲「繁忙等待檢查」允許它僅用於添加新作業,並且在實際假脫機區域上刪除作業,而信號需要添加/刪除作業,而且還需要轉到睡眠狀態信號是關鍵的,並且如果關鍵區域已經進入,那麼突然增加對於要做什麼的閥芯的高要求,因爲這可能導致塊,導致其他塊和可能的不可預見的死鎖。

+0

哇,我認爲這是一個非常開放式的問題。關於這種系統(大多數稱爲代理)有很多寫法 - 只是搜索基於代理的系統。 – Carsten

+0

是啊,直接掉到深處,試圖不沉下去。感謝您的建議。我會仔細看看的。我所追求的是一種「模式」,可以幫助我以一種好的方法解決這個問題。一旦我找到正確的模式,搞清楚實際的執行情況就是樂趣的一半。 – Taoh

+1

我不確定我是否理解你的所有問題,但[主動對象設計模式](http://en.wikipedia.org/wiki/Active_object)在這裏可能會有用。 – dtb

回答

1

我經常在各種系統上使用這樣的模型。我爲代理定義了一個類,稱爲「AgentClass」,爲請求定義一個類,稱爲「RequestClass」。代理有兩個抽象方法,'submit(RequestClass * message)'和'signal()'。通常,代理中的一個線程構造一個生產者 - 消費者隊列並等待RequestClass實例,submit()方法將傳遞的RequestClass實例排隊到隊列中。 RequestClass通常包含一個'command'枚舉,告訴代理需要做什麼以及執行請求和'發件人'代理實例所需的所有數據。代理程序獲取請求時,會打開枚舉以調用正確的函數來執行請求。代理僅對RequestClass中的數據起作用 - 結果,錯誤消息等被放置在RequestClass的數據成員中。代理程序執行了請求(或失敗並生成的錯誤數據)後,它可以將請求提交給發件人(即請求已異步執行),也可以調用發件人的signal()函數,這表示發件人正在等待的事件(即請求被同步執行)。

我通常會在啓動時構建固定數量的RequestClass實例,並將它們存儲在全局「池」P-C隊列中。任何代理/線程/除了需要發送請求之外都可以使RequestClass實例出隊,填充數據,將其提交給代理,然後等待或同步等待請求執行。完成後,RequestClass將返回到池中。我這樣做是爲了避免連續的malloc/free/new/dispose,容易調試,(我使用定時器將池級別轉儲到狀態欄,所以我總是會注意到請求是否泄漏或被雙重釋放),並消除需要在應用程序關閉時顯式線程終止,(如果多個線程只讀取/寫入超出應用程序表單等數據區域,應用程序將很容易關閉,操作系統可以處理所有線程 - 有數百篇關於'關閉應用程序時乾淨地關閉線程' - 我從不打擾!)。

這樣的消息傳遞的設計,因爲只有鎖定死鎖相當耐,(如果有的話),在PC隊列,但你肯定能實現它,如果你足夠努力:)

是這個你似乎需要的某種系統,還是我弄錯了?

RGDS, 馬丁

相關問題