我有两个在同一台机器上运行的 .net 应用程序。 第一个应用程序是“引擎”。它生成图像 - 图像大小约为4M。 第二个应用程序是“查看器”。它显示由“引擎”发送的图像。 引擎每10-15秒发送一次图像。
我的问题是,如何从引擎传递图像给查看器最好。 目前,我使用FileSystem进行此操作。 引擎将图像写入文件系统文件夹,查看器使用FileSystemWatcher获取此文件。
这种方法可行吗? 这可靠吗?
我有两个在同一台机器上运行的 .net 应用程序。 第一个应用程序是“引擎”。它生成图像 - 图像大小约为4M。 第二个应用程序是“查看器”。它显示由“引擎”发送的图像。 引擎每10-15秒发送一次图像。
我的问题是,如何从引擎传递图像给查看器最好。 目前,我使用FileSystem进行此操作。 引擎将图像写入文件系统文件夹,查看器使用FileSystemWatcher获取此文件。
这种方法可行吗? 这可靠吗?
有用的链接:
有一些很好的选择:
这些选项中的任何一个都足够快,所以我建议选择最容易实现的。
在我看来,消息队列(MSMQ)是最简单易用的,它可以提供对象传输(而不是流),并且可以提供可选的传输持久性(在发送方或接收方未运行的情况下非常有用)。所有这些对于使用MSMQ的WCF也是正确的,但是WCF意味着更多的开销、复杂性和配置,并且没有额外的(在这种情况下)价值。
像这样发送:
MessageQueue queue = new MessageQueue(".\\private$\\ImagesQueue");
Message msg = new Message
{
Formatter = new BinaryMessageFormatter(),
Body = myImage,
Label = "Image"
};
queue.Send(msg);
接收:
MessageQueue queue = new MessageQueue(".\\private$\\ImagesQueue");
msg = queue.Receive(TimeSpan.FromMilliseconds(100));
if (msg != null)
{
msg.Formatter = new BinaryMessageFormatter();
myImage = (MyImage)msg.Body;
}
在使用之前需要创建队列。您可以在应用程序启动时执行此操作。
在您的类中添加以下内容:
private const string queueName = ".\\private$\\ImagesQueue";
在应用程序初始化/启动时,请确保您有您的队列:
if (!MessageQueue.Exists(queueName)
{
MessageQueue myQueue = MessageQueue.Create(queueName);
}
使用ZeroMQ。它非常易于使用(如果您只发送一种类型的消息,则比WCF更容易),没有太多开销,并且通常是解决许多进程间通信问题的好方法。
是的,这是一种有效的方法。并且假设您的代码没有错误,那么它是可靠的。
但是它很慢。如果吞吐量是一个问题,您可能需要使用套接字(如果您想将引擎和查看器拆分到不同的机器上)或命名管道(用于在同一台机器上进行进程间通信)。