哪种通信技术更适合在两个应用程序之间进行通信

时间:2012-06-18 04:37:30

标签: c#

C#WinForms:两种应用程序可以通过两种方式进行通信,我对这方面的知识不是很了解,但我想到了MSMQ和Named Pipes之类的东西,但不确定什么是最好的。所以这是场景,你认为最好的方法是什么:

假设我写了一个Windows服务,有时会将某些文件备份到某个地方。 用户打开我的应用程序XYX,我希望他收到通知,告诉你那里有新的备份文件。

这就是全部。这就是场景。

3 个答案:

答案 0 :(得分:1)

使用MSMQ,因为它非常简单,您可以使用对象。然后,生产者和消费者可以非常简单地相互交互。这两个应用程序(Producer,COnsumer)可以在同一台机器上,通过网络,甚至在不总是连接的不同机器上。 MSMQ被认为是故障安全的,因为如果第一次传输失败,它将重试发送消息。这使您可以非常确信您的应用程序消息将到达目的地。

More Details

答案 1 :(得分:1)

我们在最近的项目中使用了命名管道用于类似目的。代码结果非常简单。我不能声称这个特定的代码,但它是:

    /// <summary>
    /// This will attempt to open a service to listen for message requests. 
    /// If the service is already in use it means that another instance of this WPF application is running.
    /// </summary>
    /// <returns>false if the service is already in use by another WPF instance and cannot be opened;  true if the service sucessfully opened</returns>
    private bool TryOpeningTheMessageListener()
    {
        try
        {
            NetNamedPipeBinding b = new NetNamedPipeBinding();
            sh = new ServiceHost(this);
            sh.AddServiceEndpoint(typeof(IOpenForm), b, SERVICE_URI);
            sh.Open();

            return true;
        }
        catch (AddressAlreadyInUseException)
        {
            return false;
        }
    }

    private void SendExistingInstanceOpenMessage(int formInstanceId, int formTemplateId, bool isReadOnly, DateTime generatedDate, string hash)
    {
        try
        {
            NetNamedPipeBinding b = new NetNamedPipeBinding();
            var channel = ChannelFactory<IOpenForm>.CreateChannel(b, new EndpointAddress(SERVICE_URI));
            channel.OpenForm(formInstanceId, formTemplateId, isReadOnly, generatedDate, hash);
            (channel as IChannel).Close();
        }
        catch
        {
            MessageBox.Show("For some strange reason we couldnt talk to the open instance of the application");
        }
    }

在我们的OnStartup中,我们只是

        if (TryOpeningTheMessageListener())
        {
            OpenForm(formInstanceId, formTemplate, isReadOnly, generatedDate, hash);
        }
        else
        {
            SendExistingInstanceOpenMessage(formInstanceId, formTemplate, isReadOnly, generatedDate, hash);
            Shutdown();
            return;
        }

答案 2 :(得分:0)

有很多方法可以实现您的要求;

  1. 正如Damith所说,进入数据库并从中读取。
  2. 在文件中输入并从中读取。
  3. 使用WCF - Windows Communication Foundation并将配置设置为使用MSMQ绑定。阅读WCF & MSMQ文章,开始使用。