在C#应用程序之间流式传输数据

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();
        }
    }

事实上,我需要将它放在单独的线程中吗?(我尝试过,但不成功)因为像这样,当事件处理程序继续触发并生成数据(将其存储到两个变量中)时,软件似乎无法继续进行。
如果问题有点模糊,很抱歉,这是我第一次尝试分布式应用程序,所以我也有些困惑...任何建议或帮助都将不胜感激!
谢谢您!

你需要同时运行这两个应用程序吗?如果其中一个没有运行,你希望发生什么? - Dour High Arch
2个回答

3
使用内存映射文件,可以直接在应用程序之间共享内存。这比其他方法快得多。
查看名为非持久性内存映射文件的章节,其中详细介绍了通过字符串名称共享内存段的方法。我在一个我参与开发的应用程序中使用它进行调试,速度足够快,我的C#应用程序能够实时读取本机应用程序的内存。
如果您通过此方法传输数据,请考虑如何一般地传输数据。确定轮询频率(例如每100毫秒),让应用程序A将数据写入内存映射文件。然后让应用程序B读取该内存映射文件并将其存储在本地集合中。这是数据传输过程。
因此,A基本上将相同的结构体重复写入内存映射文件,而B按照给定的轮询率读取它,并将轮询到的内容存储在一个集合中。

这应该也可以在 while(true) 循环内正常工作,以保持传输,对吧?好的,问题是...我尝试过使用 StreamWriter 向 WPF 应用程序发送消息,但我无法同时传输和收集数据。你能否请指点一下如何保持数据传输的示例,也许使用内存映射文件? - Liunai
刚刚编辑了一些传输逻辑。MSDN文章清楚地概述了如何从MMF中写入和读取数据,因此传输更多是逻辑问题而不是语法问题;这就是为什么没有发布代码的原因。 - Will Custode

1
如果两个应用程序都是.NET,为什么不使用WCF进行进程间通信:WCF比使用文件更加强大。请查看此链接WCF基本进程间通信

WCF 的性能不如 MMF,而且如果她正在进行传感器轮询,她可能需要非常快的速度。 - Will Custode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接