2011-12-16 78 views
5

問題不一定做的問題正義的措辭......什麼是WCF服務和獨立線程之間進行通信的最佳方式?

  • 我有一個客戶端UI坐在沙發上與本地框和一個後臺窗口服務,以支持它,而它執行後臺功能。
  • 客戶端用戶界面只是表示層,而Windows服務執行所有的硬性操作...所以需要在他們兩個之間進行通信。在谷歌上花了一段時間並閱讀最佳實踐後,我決定使用WCF和命名管道來製作服務層。
  • 客戶端UI是WCF客戶端,而Windows服務充當WCF主機(僅在本地託管)來支持客戶端。

所以這工作正常,因爲它應該。客戶端UI可以將數據傳遞給WCF主機。但我的問題是,我如何使這些數據有用? 我有幾個引擎運行在Windows服務/ WCF主機上,但WCF主機完全不知道任何後臺引擎的存在。我需要客戶端的通信請求才能夠與這些引擎進行交互。

有沒有人有任何關於如何處理WCF主機和正在運行的線程之間進行通信的良好設計模式或方法的想法?

+0

你在談論消息隊列類型模式嗎?你需要異步排隊,然後在完成後向客戶報告? – slugster 2011-12-16 01:43:22

回答

3

我認爲你最好的選擇是有一些靜態屬性或方法可以用來在服務線程/進程和WCF服務之間交換數據。

或者,我們採用的方法是通過使用數據庫,其中客戶端或wcf服務排隊請求服務進行響應,服務在可用時更新數據庫,並將響應這些請求。然後,客戶端定期輪詢數據庫(通過WCF)以檢索未完成請求的結果。

例如,如果客戶端需要生成報告,我們通過WCF發出請求並且WCF在數據庫中創建報告生成請求。

負責生成報告的服務定期輪詢此表,並且當它找到新條目時,它將關閉生成報告的新線程/進程。

當報告已完成(成功或失敗)時,服務會使用結果更新數據庫表。

同時,如果任何提交的報告已完成,客戶會定期詢問WCF服務。 WCF服務反過來查詢已完成但尚未交付給客戶端的請求,從中收集信息並將其返回給客戶端。

這種機制允許我們做了兩件事情:

1)我們可以擴展服務的處理跨多個物理/虛擬機,這些請求的工作量增加的數量。

2)給定的服務可以支持衆多的客戶。 3)通過WCF界面,我們可以將此支持擴展到我們選擇支持的任何客戶端平臺(web,win,tablet,phone等)。

忘了提:

只是因爲我們選擇使用一個數據庫並不意味着你爲了實現這種模式必須。您可以通過創建靜態請求集合來輕鬆實現相同的功能,WCF服務和輔助服務訪問的方式與我們使用數據庫的方式非常相似。

您只需要非常小心地正確獲取和釋放靜態屬性上的鎖定以避免跨線程衝突或死鎖。

+0

我想你已經死了。我正在考慮使用數據庫表作爲消息隊列流,但我擔心與數據庫記錄有關的開銷(查看N個客戶端如何與其服務器進行通信)。你的「忘記提及」是我認爲的最好的計劃,因爲我可以使用靜態隊列結構排隊消息,而不是將它們堅持在完成後沒有價值的地方。這樣,如果我使用正確的線程鎖定過程,我可以訪問靜態消息並根據需要將它們出隊。非常感謝。 – jermny 2011-12-16 01:56:59

相關問題