2012-08-16 30 views
1

我已經開發了一些代碼,從硬件設備接收一系列值,每50ms以名稱/值對的形式出現。我想開發一個發佈/訂閱服務,當某個特定項目的價值發生變化時,可以通知訂閱者。訂閱方法可能如下所示: -C#pub/sub服務 - 如何在後臺線程上觸發事件?

public void Subscribe(string itemName, Action<string, long> callback) 

讀取硬件值的代碼將檢查自上次以來是否更改了值。如果是這樣,它將遍歷該項目的任何訂閱者,並調用他們的代表。就目前情況而言,代表們將被調用到不理想的同一線程 - 我需要儘可能快地保持輪詢。在不同的線程上調用回調委託最好的方法是什麼?用戶是否應該通過(說)一個任務/線程,還是應該由出版商負責將這些內容翻轉過來?

請注意,我需要一對夫婦的參數傳遞給委託(項目名稱和它的價值),所以這可能會影響所採取的辦法。我知道你可以將單個「狀態」對象傳遞給任務,但它感覺有點不直觀,需要訂閱者實現一個Action回調委託(然後必須將其轉換爲包含名稱和值的其他類型)。

另外,我假設創建新任務/每一個委託調用會傷害到表演時間,所以某種「池」線程可能會被要求?

+0

小提示:從控制您的形式從不同的線程上讀取數據時,你需要確保你調用它們。最好的方法是'if([CONTROL] .InvokeRequired)'然後'[CONTROL] .Invoke( new MethodInvoker(()=> [GET或SET TO THE CONTROL]); – TheGeekZn 2012-08-16 09:35:46

回答

1

我會認爲,你現在有,把迅速採取行動的責任推給回調,即相同的結構。回調不應直接阻止或執行復雜冗長的操作。

如果一個特定的回調需要執行任何冗長的動作,它應該將Action數據排隊到它自己的線程,然後立即返回,例如。它可能會將數據BeginInvoke/PostMessage發送到一個GUI線程,將其排隊到一個插入數據庫表或將其排列到記錄器(或實際上,任何組合鏈接在一起)的線程。然後這些冗長/阻塞操作可以並行進行,同時設備接口繼續輪詢。

通過這種方式,您可以保持您擁有的工作結構,並且不必將任何線程間通信強加到不需要它的回調上。設備接口仍然封裝,只是發射回調。

編輯:

「創建新任務/每一個委託調用會傷害演出時間線程」 - 是的,而且這將是難以維持的狀態。通常,這樣的線程寫成while(true)循環,頂部有一些信號調用,例如。一個阻塞隊列pop(),所以只需要在啓動時創建一次,並且永遠不需要終止。

相關問題