【发布时间】:2014-01-04 22:59:34
【问题描述】:
我正在使用 MemoryMappedFile 在 2 个程序之间进行通信。程序“A”创建 mmf 并在计时器上读取它的内容。程序“B”将 xml 数据写入计时器上的 mmf。我的内存映射工作正常,但我遇到了一个问题,即 XML 数据的上一次迭代比当前数据更长,并且旧数据被转移到下一轮。
所以为了简单起见,让我们说程序 B 写
啊啊
程序 A 会正确读取,
那么程序 B 的下一个写入是:
b
程序 A 读取
咩
似乎应该有一些简单的方法来刷新内存映射文件的内容,但我似乎无法弄清楚。我的处理方式很可能完全错了。
这是我目前正在做的事情。
程序 A:
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap",MemoryMappedFileRights.ReadWrite))
{
Mutex mutex = Mutex.OpenExisting("testmapmutex");
mutex.WaitOne();
string outputtext;
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0,0))
{
XmlSerializer deserializer = new XmlSerializer(typeof(MyObject));
TextReader textReader = new StreamReader(stream);
outputtext = textReader.ReadToEnd();
textReader.Close();
}
mutex.ReleaseMutex();
return outputtext; //ends up in a textbox for debugging
}
程序 B
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap", MemoryMappedFileRights.ReadWrite))
{
Mutex mutex = Mutex.OpenExisting("testmapmutex");
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, 0))
{
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
TextWriter textWriter = new StreamWriter(stream);
serializer.Serialize(textWriter, myObjectToExport);
textWriter.Flush();
}
mutex.ReleaseMutex();
}
【问题讨论】:
-
我想知道
stream.SetLength(stream.Position);在这种情况下是否可以在当前位置截断文件。 -
您的第一次尝试是偶然的,MMF 仍然包含二进制零,XmlSerializer 会忽略它们。第二次尝试没有这样的运气。您传递给 CreateViewStream() 的参数很重要,您必须传递正确的大小。这是一个令人讨厌的先有鸡还是先有蛋的问题,也需要进入 MMF。 XML 不适合 MMF 还有一个特别讨厌的问题。您完全没有在这里获得 MMF 的好处,因为它们在托管代码中很少,所以使用命名管道要好得多。
-
你说得对。有人指出我昨天应该使用命名管道,但随后删除了他的答案。我今天把整个东西都换了,我认为它对我有用。
-
我是否应该删除整个问题,因为我已经放弃了这个策略而支持命名管道?
-
我无法为同一问题找到可接受的解决方案,因此我的解决方法是为每条消息传递一个 GUID,客户端将其跟踪为 LastGuid,然后反序列化当前消息 Guid 是否为同样它忽略该消息。对于应该直截了当的事情,仍然感觉像是一个糟糕的黑客解决方法。
标签: c#