[英]How to make Memory-Mapped files in a web application visible to all threads
我有以下代码,这是Memory-Map文件的入口点,换句话说,这是对服务器的第一个请求,服务器将输入字符串写入MM文件,以便以后可用于其他请求:
internal string SetInput(string input)
{
try
{
MemoryMappedFile mmFile = MemoryMappedFile.CreateOrOpen("Map",2048,MemoryMappedFileAccess.ReadWrite);
using (MemoryMappedViewStream vStream = mmFile.CreateViewStream())
{
BinaryWriter bw = new BinaryWriter(vStream);
bw.Write(input);
}
Logger.AddEntry(Logger.Level.Inf, input);
}
catch (Exception e)
{
Logger.AddEntry(input, e);
return "W";
}
}
现在,我将以下代码与其他请求一起使用,以便他们可以读取第一个请求发送的内容:
private bool GetInput()
{
try
{
using (MemoryMappedFile mmFile = MemoryMappedFile.OpenExisting("Map"))
{
using (MemoryMappedViewStream stream = mmFile.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
string s = reader.ReadString();
try
{
// Do sth
}
catch (Exception e)
{
Logger.AddEntry(s, e);
return false;
}
}
}
}
catch (IOException e)
{
Logger.AddEntry(e);
return false;
}
return true;
}
但是,当最后一个函数尝试打开MM文件时,它将得到IOException:文件未找到。
我在做什么错,我以为MM文件在.NET中充当共享内存机制,还是我的代码中缺少某些内容?
在SetInput
如何调用SetInput
或GetInput
情况下,我必须做一些假设。
您是否正在同步对GetInput
和SetInput
的调用? 如果有请求进入,而您在第一个请求创建完毕之前尝试映射到命名区域,则会遇到问题。 您可能需要创建一个共享的互斥锁来同步对文件的访问。
另外,根据您的Web请求的处理方式,处理第一个请求的过程可能在第二个请求进入时已MemoryMappedFile.CreateOrOpen
,这将释放第一次调用MemoryMappedFile.CreateOrOpen
所持有的句柄,从而导致操作系统释放文件。 数据将不会被持久化,因为文件没有被文件系统支持。
尝试使用CreateFromFile
创建一个由文件系统支持的共享内存区域,看看是否仍然遇到问题。
不过,我质疑您直接使用共享内存。 我对您的项目一无所知,但是还有其他实现IPC的机制。 根据您的特定情况,您可能会发现使用DBMS更容易(甚至是像sqlite这样的小数据库)也可以使用。
如果您想要传递消息,那么有很多现有的选项也可以减轻您的痛苦。 看到这个问题 ,还有这个 。 我认为您在WCF上会很幸运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.