C# MemoryMappedFile不';不能使用2个流程?

C# MemoryMappedFile不';不能使用2个流程?,c#,.net-4.0,memory-mapped-files,C#,.net 4.0,Memory Mapped Files,我用MemoryMappedFile做了一个简单的测试,如图所示: 2个进程,1个内存映射文件: 第一个进程添加字符串“1” 第一个进程等待 第二个进程添加字符串“2”并终止 第一个进程现在读取整个内存映射文件 过程A: 过程B: 结果是: 胡 “1”、“2”在哪里 但是,如果我只运行第一个进程(不激活进程B),我会得到: 我错过了什么 我希望看到: Process A says: 1 Process B says: 2 编辑 我注意到ProcessB的代码中有一个明显奇怪的东西。此代

我用
MemoryMappedFile
做了一个简单的测试,如图所示:

2个进程,1个内存映射文件:

  • 第一个进程添加字符串“1”
  • 第一个进程等待
  • 第二个进程添加字符串“2”并终止
  • 第一个进程现在读取整个内存映射文件
过程A: 过程B: 结果是:

“1”、“2”在哪里

但是,如果我只运行第一个进程(不激活进程B),我会得到:

我错过了什么

我希望看到:

Process A says: 1
Process B says: 2
编辑

我注意到
ProcessB
的代码中有一个明显奇怪的东西。此代码

using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0))
从第一个字节创建视图,但
.NET
中的字符串为2个字节。我想你把
1->2
变成2就足够了。因此,
ProcessB
视图从映射文件开始的偏移量将在已从
ProcessA
插入“1”字符串之后

在你的情况下,你似乎重叠了它们


希望这能有所帮助。

您正在讨论BinaryWriter.Write(string)的实现细节。它首先写入字符串的长度,这是必需的,以便BinaryReader知道在回读字符串时需要读取多少个字符。对于短字符串,如“1”,它写入一个字节来存储长度

因此,传递给CreateViewStream()的偏移量是错误的,传递1将使其覆盖进程A编写的字符串的一部分。您看到的笑脸字符是(char)1的标志符号。进程B写入的字符串的长度字节


内存映射文件在托管代码中很麻烦。通常通过声明一个结构来设置布局并使用指针访问视图来读写它们,但这需要不安全的代码。对于一块内存来说,流是一个相当糟糕的抽象,但却是一个必要的缺点。这也是MMF在.NET中使用了这么长时间的原因。

在MSDN的示例中,他们写数字,而你写字符串。传递给CreateViewStream的偏移量可能错误!这将解释BinaryReader@Steve他们没有考虑任何补偿。。。我刚把bool改为string。。但是,如果内存可用,UTF8是两个字节,你写第二个字符串,从字节1开始,覆盖第一个字符串的第二个字节。@steve UTF8中的8是每个字符的位数,你不应该这样写代码。一个明显的失败模式是A写的字符串比B计数的字符串长。感谢回复,如果我在
writer.write(“1”)-你实际上是在告诉我从B上的适当索引中读取。但是我怎么知道索引呢?这正是问题所在。MMF只有在其映射的内存被可预测地分割时才能正常工作。只考虑具有值类型的结构。如果您确实想要实现长度不可预测的流,那么管道是更好的选择。但是,您可以通过让A写入长度来实现这一点。B能读,知道在哪里写。你需要两个视图。汉斯,但是当我把
1
2
作为整数时,它也不起作用,它们都是相同大小的…?汉斯!对于int,我可以看到它在工作:)在A中,我写了
1
,在B中,我使用了4个字节(作为int),一切都很好。现在,我将尝试使用字符串…(我如何知道长度?是xxx.length够了吗?-在非unicode中…)
Process A says: 1
Process B says: 2
using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0))