2

C#WinForms: 2 つのアプリケーションが連携する方法はいくつかあります。私はこの分野についてあまり詳しくありませんが、MSMQ や名前付きパイプのようなものが頭に浮かびますが、どれが最適かはわかりません。シナリオは次のとおりです。最善のアプローチは何だと思いますか。

いくつかのファイルを時々どこかにバックアップする Windows サービスを書いているとしましょう。ユーザーが私のアプリケーション XYX を開くと、あそこに新しいバックアップ ファイルがあることを彼に知らせてほしい。

それで全部です。これがシナリオでした。

4

3 に答える 3

1

実装が非常に簡単で、オブジェクトを操作できるため、MSMQを使用します。これにより、プロデューサーとコンシューマーは非常に簡単に相互作用できます。これら2つのアプリケーション(プロデューサー、COnsumer)は、同じマシン上、ネットワーク全体、または常に接続されているとは限らない異なるマシン上に存在する可能性があります。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 に答える