繁体   English   中英

如何使Web应用程序中的内存映射文件对所有线程可见

[英]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如何调用SetInputGetInput情况下,我必须做一些假设。

您是否正在同步对GetInputSetInput的调用? 如果有请求进入,而您在第一个请求创建完毕之前尝试映射到命名区域,则会遇到问题。 您可能需要创建一个共享的互斥锁来同步对文件的访问。

另外,根据您的Web请求的处理方式,处理第一个请求的过程可能在第二个请求进入时已MemoryMappedFile.CreateOrOpen ,这将释放第一次调用MemoryMappedFile.CreateOrOpen所持有的句柄,从而导致操作系统释放文件。 数据将不会被持久化,因为文件没有被文件系统支持。

尝试使用CreateFromFile创建一个由文件系统支持的共享内存区域,看看是否仍然遇到问题。


不过,我质疑您直接使用共享内存。 我对您的项目一无所知,但是还有其他实现IPC的机制。 根据您的特定情况,您可能会发现使用DBMS更容易(甚至是像sqlite这样的小数据库)也可以使用。

如果您想要传递消息,那么有很多现有的选项也可以减轻您的痛苦。 看到这个问题 ,还有这个 我认为您在WCF上会很幸运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM