3

2 つのアプリケーション間でデータを共有しようとしています。最初のアプリケーションはセンサーから継続的にデータを取得します。必要なのは、これらのデータを受信中に別の (WPF) アプリケーションに送信する (そしてグラフを描画する) ことだけです。

データは EventHandler を介して受信され、次のようにソケットを介して送信されます。

    static TcpClient client = new TcpClient("localhost", 8181);
    static double w, dba;

    static void Write()
    {
        try
        {
            Stream s = client.GetStream();
            StreamReader sr = new StreamReader(s);
            StreamWriter sw = new StreamWriter(s);
            sw.AutoFlush = true;
            while (true)
            {
                String line = "W:" + w + "DB/A:" + dba;
                sw.Write(line);
                Console.WriteLine(sr.ReadLine());
            }
            s.Close();
        }
        finally
        {
            client.Close();
        }
    }

問題は、別のスレッドに入れる必要がありますか? (私が試みたように、失敗しました)このように、eventHandlerがトリガーされてデータを生成し続けている間(それを2つの変数に格納している間)、swは続行できないようです。

質問が少し曖昧な場合は申し訳ありません。分散アプリを使用するのは初めてなので、少し混乱しています..アドバイスや助けをいただければ幸いです!

ティア

4

2 に答える 2

3

アプリケーション間でメモリを直接共有できるメモリ マップ ファイルを使用します。他のほとんどのアプローチよりも大幅に高速になります。

Non-Persisted Memory-Mapped Files というセクションを見てください。これには、文字列名を介してメモリのセグメントを共有する方法が詳しく説明されています。私はこれを、デバッグ目的で取り組んでいたアプリケーションで使用しています。C# アプリケーションがネイティブ アプリケーションのメモリをリアルタイムで読み取ることができるほど十分に高速です。

この方法でデータを送信する場合は、一般的なデータ送信方法を検討してください。ポーリング頻度 (たとえば 100 ミリ秒ごと) を決定し、アプリケーション A にデータをメモリ マップ ファイルに書き込みます。次に、アプリケーション B にそのメモリ マップ ファイルを読み取らせ、コレクションにローカルに格納します。これはあなたの送信です。

したがって、A は基本的に同じ構造をメモリ マップド ファイルに書き込んで再書き込みし、B はそれを特定のポーリング レートで読み取り、ポーリングしたものをコレクションに格納します。

于 2013-09-26T14:24:07.390 に答える
1

両方のアプリが .net の場合、プロセス間通信に WCF を使用してみませんか。ファイルを使用するよりもはるかに堅牢です。このリンクを参照してくださいWCF Basic Interprocess Communication

于 2013-09-26T15:17:20.130 に答える