gpt4 book ai didi

.net - 与 MemoryMappedFile 的连接不可靠

转载 作者:行者123 更新时间:2023-12-02 06:37:27 28 4
gpt4 key购买 nike

我有两个 .NET 4.0 WinForms 应用程序(主要)从共享的 MemoryMappedFiles 读取地理数据。最终用户可以自由启动其中一个应用程序或另一个应用程序,或同时运行这两个应用程序。第一个打开的应用程序创建命名的 MemoryMapFile-s,第二个打开已经存在的应用程序。 但是,打开现有的已命名的 MemoryMappedFile 似乎并不可靠。它适用于大约 80% 的案例,但大约 20% 的案例因 FileNotFoundException 而失败。 症状无法安全地重现,失败和成功似乎都是纯粹的运气。

这是两个应用程序用来获取 MemoryMappedFiles 的代码:

private static MemoryMappedFile GetMemoryMappedFile(string filePath)
{
string mapName = filePath; // I have also tried here @"Global\myfile", no difference
MemoryMappedFile mmf = null;
try
{
// When the first app executes this step, it always succeeds.
// When the second app comes here, it fails as it should.
mmf = MemoryMappedFile.CreateFromFile(filePath, FileMode.OpenOrCreate,
mapName, HundredMB, MemoryMappedFileAccess.ReadWrite);
}
catch (IOException)
{
try
{
// Opening the already existing named MemoryMappedFile by the SECOND app.
// This line fails about 20% of the time.
mmf = MemoryMappedFile.OpenExisting(mapName,
MemoryMappedFileRights.ReadWrite);
}
catch (FileNotFoundException ex)
{
Console.WriteLine("Yet again, could not open MMF. Life sux.");
}
}
return mmf;
}

最佳答案

 string mapName = filePath;

这看起来很可疑。 filePath 字符串应始终引用文件的绝对 路径名。像“c:\foo\bar\baz.bin”,绝不是相对文件名,如“baz.bin”。像“Global\myfile”这样的名字不是路径名,而是内存映射名。这是另一个进程用来打开映射的文件,它不知道也不关心充本地图后备存储的实际文件。

失败的一种常见方式是当您的程序的工作目录 (Environment.CurrentDirectory) 未设置在您希望设置的位置时。除了突然发现 CreateFromFile() 调用失败之外,它有一种在您没有意识到的情况下进行更改的诀窍。

因此,通过选择一个高度特定于您的应用程序的唯一 map 名称来解决您的问题。以及您选择的具有完整路径名的文件。通常存储在 AppData 中,您可以在没有 UAC 提升的情况下写入该文件夹。

关于.net - 与 MemoryMappedFile 的连接不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14879604/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com