У меня есть два приложения .NET 4.0 WinForms, которые (в первую очередь) читают географические данные из общих MemoryMappedFiles. Конечный пользователь может запускать одно из приложений или другое или запускать оба одновременно. Первое приложение, которое открывается, создает имя MemoryMapFile-s, второе открывает уже существующие. Однако открытие существующего имени MemoryMappedFile кажется ненадежным. Он работает примерно в 80% случаев, но около 20% случаев он терпит неудачу с FileNotFoundException. Симптом не безопасно воспроизводится, кажется, что это просто удача, когда он терпит неудачу, и когда это удается.Неудовлетворительное подключение к MemoryMappedFile
Вот код, используемый как приложения, чтобы получить 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;
}
Хотя вы технически верны, это вряд ли является реальной проблемой. Приложения создают/открывают MMF, когда они запускают и закрывают их только тогда, когда они убиты. Кроме того, приложения работают круглосуточно. Всегда второй терпит неудачу, когда он открывается. – user256890
Ну, вы действительно не предоставили никакой информации, чтобы предположить, что ваш код не виноват и что.Внедрение NET Framework в MemoryMappedFile либо ошибочно, либо не документировано правильно. Все, что вы описали, предполагает, что у вас есть состояние гонки больше всего на свете. –
Попробуйте использовать 'File.Exists', чтобы увидеть, возвращает ли он' false', когда происходит 'FileNotFoundException'. Это еще одно условие гонки; но он должен быть «ложным» больше, чем «истина» с 20% -ой неудачей, если ваша проблема действительно является условием гонки. Если это всегда 'истина', то да, у вас, вероятно, нет условия гонки в вашем коде. –