2015-12-02 84 views
2

我有一个Outlook插件和一个桌面应用程序。我在两个应用程序中都实现了相同的同步过程。但是,我不想让用户同时从两个应用程序运行同步过程。因此,当同步正在运行并且用户尝试从另一个应用程序开始同步。他/她显示一条消息,表示同步已经在运行,并且同步请求被中止。为了实现这一点,我正在考虑创建一个文件,并且每当一个应用程序启动同步时,它就会在该文件中创建一个条目。因此,如果用户然后尝试从第二个应用程序开始同步,然后首先检查文件是否存在条目,如果条目存在,则请求中止。是否有其他方法可以执行此操作?如何将消息从一个桌面应用程序传递到在同一台计算机上运行的另一个桌面应用程序?

+0

套接字?管? – Dmitriy

+2

那么像[互斥](https://msdn.microsoft.com/en-us/library/system.threading.mutex(v = vs.110).aspx)? –

+1

认为,它是这样的重复:http://stackoverflow.com/questions/4123923/synchronizing-2-processes-using-interprocess-synchronizations-objects-mutex-or或 – Dmitriy

回答

2

如果您可以控制这两个应用程序,那么您可以使用命名管道来启动它们之间的通信。 命名管道是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(); 

希望这会帮助你。

+0

我会用WCF抽象出管道。 – Aron

+0

它不是wcf管...没有配置...但只有点名像“MyServerPipe” –

+0

是的,为什么只有有香蕉(管)时,你可以有大猩猩(wcf)和babana(管)..请注意讽刺:P –

2

你不想要IPC。 IPC将这个问题归结为两个将军问题,即使在IPC的情况下,您也会遇到竞争状况。

更合理的是创建第三个进程,一个负责存储和同步数据的服务。我将把这个服务称为数据库。

然后,Outlook插件和桌面应用程序只能连接并从数据库中抓取数据。

它们也可以在需要时请求同步,但知道数据库服务在任何时候只能运行一次同步。

最后,有很多免费产品可以为您提供此功能,而无需您明确写入,例如,您可以使用CouchDB服务进行数据同步/存储。

相关问题