2

C#WinForms:两个应用程序有几种方法可以一起交谈,我在这方面不是很了解,但我想到了 MSMQ 和命名管道之类的东西,但不确定哪种方法最好。所以这是一个场景,你认为最好的方法是什么:

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

就这样。这就是情景。

4

3 回答 3

1

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

更多细节

于 2012-06-18T04:51:19.740 回答
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;
        }
于 2012-06-18T04:54:31.847 回答
0

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

  1. 正如达米斯所说,进入数据库并从中读取。
  2. 在文件中创建一个条目并从中读取。
  3. 使用 WCF - Windows Communication Foundation 并将配置设置为使用 MSMQ 绑定。阅读WCF 和 MSMQ文章以帮助您入门。
于 2012-06-18T04:59:33.017 回答