我有一个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. 如果一个桌面应用程序从应用UWP
- 5. 如何让桌面应用程序调用同一台机器上的Java应用程序上的方法
- 6. Java:将一个小程序转换为桌面应用程序
- 7. 构建一个桌面应用程序以定期运行
- 8. 运行Node-Webkit就像一个桌面应用程序
- 9. 将凭据传递从桌面应用程序到Django应用程序
- 10. 从同一台机器上的Windows服务发送消息到桌面应用程序
- 11. 如何将Windows桌面应用程序转换为Mac桌面应用程序?
- 12. 从Android应用程序上传数据到桌面程序
- 13. 发送一个跨平台桌面应用程序
- 14. 从另一个新应用运行一个节点的webkit桌面应用程序
- 15. 在桌面应用程序
- 16. 创建一个桌面应用程序来设计母版页?
- 17. 为iPhone设计一个选项卡式桌面应用程序
- 18. 如何将消息从一个程序传递给另一个程序?
- 19. 我如何有一个桌面转到另一个桌面
- 20. 运行一个J2EE/Grails应用程序作为一个Windows桌面应用程序
- 21. 如何隐藏一个“Java桌面应用程序”
- 22. Windows桌面共享API:如何共享一个应用程序
- 23. 如何将网站和桌面应用程序使用同一个数据库
- 24. 将应用程序从一台计算机移动到另一台
- 25. 从一个运行控制台应用程序发送信息到另一个
- 26. HTTP POST请求到在同一台计算机上运行的应用程序?
- 27. 如何在另一台机器上运行web应用程序?
- 28. 将对象从一个应用程序传输到另一个应用程序
- 29. C#如何在桌面上运行应用程序?
- 30. 跨平台桌面应用程序
套接字?管? – 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