【问题标题】:How to pass message from one desktop application to another running on the same machine?如何将消息从一个桌面应用程序传递到同一台机器上运行的另一个应用程序?
【发布时间】:2015-12-02 12:12:23
【问题描述】:

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

【问题讨论】:

标签: c# winforms ipc desktop-application visual-studio-2008-sp1


【解决方案1】:

如果您可以控制这两个应用程序,那么您可以使用命名管道来开始它们之间的通信。 命名管道是 Windows 中进程间通信的最佳选择,适用于服务器客户端架构。named pipe 周围有 .net Wrapper,它将大大简化整个过程。

那里的代码。

服务器代码

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 抽象出管道。
  • 它不是 wcf 管道...没有配置...但只有像“MyServerPipe”这样的 pip 名称
  • 是的,为什么只有香蕉(烟斗)才能拥有大猩猩(wcf)和香蕉(烟斗)……请注意讽刺:P
  • @AdrianSalazar 你在说什么?
【解决方案2】:

您不需要 IPC。 IPC 将问题简化为两个将军问题,因为即使使用 IPC,您也会有竞争条件。

更有意义的是创建第三个进程,一个负责存储和同步数据的服务。我将此服务称为数据库。

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

他们还可以随时请求同步,因为他们知道数据库服务在任何时候只会运行一次同步。

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

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 2015-01-31
    • 2019-08-08
    • 2017-02-04
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多