3

我正在尝试在两个应用程序之间共享数据:第一个应用程序从传感器连续获取数据,我需要做的就是在将这些数据接收到另一个(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 不断被触发并产生数据(将其存储到两个变量中)时, sw 似乎无法继续。

抱歉,如果问题有点含糊,这是我第一次尝试使用分布式应用程序,所以我也有点困惑......任何建议或帮助将不胜感激!

TIA

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 回答