C# 应用程序之间的流式处理数据
本文关键字:处理 数据 应用程序 之间 | 更新日期: 2023-09-27 18:33:04
我正在尝试在两个应用程序之间共享数据:第一个应用程序从传感器连续获取数据,我需要做的就是在接收这些数据时将这些数据传输到另一个(WPF)应用程序(并绘制图形)。
数据通过事件处理程序接收,然后通过套接字传输,如下所示:
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();
}
}
问题是,我需要把它放在一个单独的线程中吗?(正如我试图的那样,没有成功)因为像这样,当事件处理程序不断被触发并产生数据(将其存储到两个变量中)时,sw 似乎无法继续。
抱歉,如果问题有点模糊,这是我第一次尝试使用分布式应用程序,所以我也有点困惑..任何建议或帮助将不胜感激!
蒂亚
使用内存映射文件,它允许您直接在应用程序之间共享内存。它将比大多数其他方法快得多。
查看名为"非持久内存映射文件"的部分,其中详细介绍了如何通过字符串名称共享内存段。我在用于调试目的的应用程序中使用它,它足够快,我的 C# 应用程序可以实时读取本机应用程序的内存。
如果通过此方法传输数据,请考虑一般如何传输数据。确定轮询频率(例如每 100 毫秒一次),并让应用程序 A 将数据写入内存映射文件。然后让应用程序 B 读取该内存映射文件并将其本地存储在集合中。这是您的传输。
因此,A 基本上将相同的结构写入和重写到内存映射文件中,B 以给定的轮询速率读取它并将其轮询的内容存储在集合中。
如果两个应用程序都是 .net,为什么不使用 WCF 进行进程间通信:比使用文件健壮得多。请参阅此链接 WCF 基本进程间通信