我有兩個不相關的進程使用.NET程序集作爲插件。但是,任何一個進程都可以隨時啓動/停止。我不能依賴作爲服務器的特定進程。實際上,可能有多個副本運行其中一個進程,但只有其中一個運行。沒有服務中介的.NET IPC
我最初實施了基於this article的解決方案。但是,這需要實施服務器的客戶端在客戶端之前運行。
當客戶端首次運行時,實現某種通知到服務器的最佳方式是什麼?
我有兩個不相關的進程使用.NET程序集作爲插件。但是,任何一個進程都可以隨時啓動/停止。我不能依賴作爲服務器的特定進程。實際上,可能有多個副本運行其中一個進程,但只有其中一個運行。沒有服務中介的.NET IPC
我最初實施了基於this article的解決方案。但是,這需要實施服務器的客戶端在客戶端之前運行。
當客戶端首次運行時,實現某種通知到服務器的最佳方式是什麼?
使用共享內存更加困難,因爲您必須管理共享內存緩衝區(或只是預先分配足夠的)。您還必須手動管理您在其中放置的數據結構。一旦你對它進行了測試和工作,由於它的簡單性,它將更容易使用和測試。
如果您使用遠程路由,則可以使用IpcChannel而不是TCP或HTTP通道進行使用命名管道的單個系統通信。 http://msdn.microsoft.com/en-us/library/4b3scst2.aspx。這個解決方案的問題是你需要想出一個註冊表類型的解決方案(無論是在共享內存還是其他持久性存儲),這些進程可以註冊他們的端點。這樣,當您在尋找它們時,您可以找到一種方法來查詢系統上運行的所有端點,並且可以找到您要查找的內容。使用Remoting的好處在於序列化和方法調用都非常簡單。另外,如果您決定轉移到網絡上的多臺計算機,則可以將交換機改爲使用網絡通道。缺點是Remoting可能會感到沮喪,除非你清楚地將「遠程」呼叫與「本地」呼叫區分開來。
我對WCF瞭解不多,但也值得關注。蜘蛛的感覺說,它可能有一個更優雅的解決這個問題......也許。
或者,您可以創建一個與所有其他進程分開並啓動的「服務器」進程(使用系統Mutex確保多個進程未啓動)充當中介和所有其他流程的註冊中心。
還有一件事要考慮事件的發佈 - 訂閱模型(Pub/Sub)。當您有一個在事件源可用之前啓動的偵聽器時,此技術會有所幫助,但您不想等待註冊該事件。 「服務器」進程將處理事件註冊表以連接發佈者和訂閱者。
爲什麼不在雙方都託管服務器和客戶端,誰先來到誰就成爲服務器?如果服務器退出,那麼仍處於活動狀態的客戶端將切換角色。
處理IPC(.net或不)的方法很多,通過TCP/HTTP隧道是一種方法......但可能是一個非常糟糕的選擇(取決於環境和環境)。
共享內存和命名管道是兩種方式(是的,他們可以在.Net中完成),這可能是更好的解決方案。在.Net框架中也有IPC類...但由於某些AppDomain問題,我個人不喜歡它們...
我同意加羅。
使用pub/sub服務將是一個很好的解決方案。這顯然意味着,這項服務需要在另外兩個之前啓動並運行。
如果您想跳過發佈/訂閱,您可以在兩個具有不同端點的應用程序中實施該服務。當任一應用程序啓動時,它會嘗試通過IPC代理訪問另一個已知對象。如果代理失敗,另一個對象沒有啓動。
斯科特
我了2天通過所有可用的IPC選項蜿蜒而尋找一個可靠,簡單和快速的方式做全雙工的IPC。我在Codeplex.com上發現的IPCLibrary,迄今爲止完全沒有嘗試過的所有選項。全部只有7行代碼。 :D如果有人在試圖找到一個全雙工IPC時遇到了這個問題,那麼可以省下很多時間,然後試試這個庫。獲取源代碼,編譯data.dll並按照給出的示例進行操作。
HTH, Circ