我有一個Outlook插件和一個桌面應用程序。我在兩個應用程序中都實現了相同的同步過程。但是,我不想讓用戶同時從兩個應用程序運行同步過程。因此,當同步正在運行並且用戶嘗試從另一個應用程序開始同步。他/她顯示一條消息,表示同步已經在運行,並且同步請求被中止。爲了實現這一點,我正在考慮創建一個文件,並且每當一個應用程序啓動同步時,它就會在該文件中創建一個條目。因此,如果用戶然後嘗試從第二個應用程序開始同步,然後首先檢查文件是否存在條目,如果條目存在,則請求中止。是否有其他方法可以執行此操作?如何將消息從一個桌面應用程序傳遞到在同一臺計算機上運行的另一個桌面應用程序?
回答
如果您可以控制這兩個應用程序,那麼您可以使用命名管道來啓動它們之間的通信。 命名管道是Windows中進程間通信的最佳選擇,它與服務器客戶端體系結構協同工作,並且存在大約簡化整個過程的.net包裝器named pipe。
從那裏的代碼。
服務器代碼
var server = new NamedPipeServer<SomeClass>("MyServerPipe");
server.ClientConnected += delegate(NamedPipeConnection<SomeClass> conn)
{
Console.WriteLine("Client {0} is now connected!", conn.Id);
conn.PushMessage(new SomeClass { Text: "Welcome!" });
};
server.ClientMessage += delegate(NamedPipeConnection<SomeClass> conn, SomeClass message)
{
Console.WriteLine("Client {0} says: {1}", conn.Id, message.Text);
};
// Start up the server asynchronously and begin listening for connections.
// This method will return immediately while the server runs in a separate background thread.
server.Start();
和客戶端代碼
var client = new NamedPipeClient<SomeClass>("MyServerPipe");
client.ServerMessage += delegate(NamedPipeConnection<SomeClass> conn, SomeClass message)
{
Console.WriteLine("Server says: {0}", message.Text);
};
// Start up the client asynchronously and connect to the specified server pipe.
// This method will return immediately while the client runs in a separate background thread.
client.Start();
希望這會幫助你。
我會用WCF抽象出管道。 – Aron
它不是wcf管...沒有配置...但只有點名像「MyServerPipe」 –
是的,爲什麼只有有香蕉(管)時,你可以有大猩猩(wcf)和babana(管)..請注意諷刺:P –
你不想要IPC。 IPC將這個問題歸結爲兩個將軍問題,即使在IPC的情況下,您也會遇到競爭狀況。
更合理的是創建第三個進程,一個負責存儲和同步數據的服務。我將把這個服務稱爲數據庫。
然後,Outlook插件和桌面應用程序只能連接並從數據庫中抓取數據。
它們也可以在需要時請求同步,但知道數據庫服務在任何時候只能運行一次同步。
最後,有很多免費產品可以爲您提供此功能,而無需您明確寫入,例如,您可以使用CouchDB服務進行數據同步/存儲。
- 1. 將數據從一個桌面/ Web應用程序傳遞到另一個桌面應用程序
- 2. 從另一個Java應用程序運行桌面應用程序
- 3. 從一個桌面應用程序
- 4. 從另一個桌面找到應用程序的窗口
- 5. 如果一個桌面應用程序從應用UWP
- 6. 如何讓桌面應用程序調用同一臺機器上的Java應用程序上的方法
- 7. Java:將一個小程序轉換爲桌面應用程序
- 8. 運行Node-Webkit就像一個桌面應用程序
- 9. 構建一個桌面應用程序以定期運行
- 10. 將對象從一個應用程序傳遞到另一個應用程序
- 11. 帶桌面應用程序的java桌面應用程序
- 12. 將憑據傳遞從桌面應用程序到Django應用程序
- 13. 在同一臺計算機上安裝Windows桌面應用程序的兩個實例
- 14. 從同一臺機器上的Windows服務發送消息到桌面應用程序
- 15. 如何將Windows桌面應用程序轉換爲Mac桌面應用程序?
- 16. 在C#桌面應用程序中的另一臺計算機上連接到mysql的錯誤
- 17. 從Android應用程序上傳數據到桌面程序
- 18. 發送一個跨平臺桌面應用程序
- 19. 從另一個新應用運行一個節點的webkit桌面應用程序
- 20. 在網頁上託管一個C++桌面應用程序
- 21. 在桌面應用程序
- 22. 將消息從一個應用程序發送到同一終端中的另一個應用程序
- 23. 從桌面應用程序運行Windows 10的相機應用程序
- 24. 創建一個桌面應用程序來設計母版頁?
- 25. 爲iPhone設計一個選項卡式桌面應用程序
- 26. 如何將消息從一個程序傳遞給另一個程序?
- 27. 運行一個J2EE/Grails應用程序作爲一個Windows桌面應用程序
- 28. 我如何有一個桌面轉到另一個桌面
- 29. 如何從Java桌面應用程序發送/傳遞消息給Chrome擴展(如Java Swing應用程序)
- 30. 如何隱藏一個「Java桌面應用程序」
套接字?管? – Dmitriy
那麼像[互斥](https://msdn.microsoft.com/en-us/library/system.threading.mutex(v = vs.110).aspx)? –
認爲,它是這樣的重複:http://stackoverflow.com/questions/4123923/synchronizing-2-processes-using-interprocess-synchronizations-objects-mutex-or或 – Dmitriy