WaitHandleCannotBeOpenedException и MMF FileNoteFoundException cacophony - PullRequest
0 голосов
/ 18 мая 2019

Резюме: EventWaitHandle.OpenExisting () и MemoryMappedFile.OpenExisting () оба сбоя, но только на одном ПК из ~ ста.

Подробно: у меня есть программа, которая использует EventWaitHandle, чтобы позволить клиенту C #объект, ожидающий, пока рабочий объект обновит некоторые данные, передаваемые через MMF.Это в программе, которая установлена, вероятно, на ста компьютерах Win 7 и Win 10.Отлично работает на всех ожидаемых на одном вонючем ПК, который клиент любезно предоставил для тестирования ... Acer Aspine V5 AMD A6-1450 1 ГГц Win10 Home x64.

Вот кодкоторый создает EventWaitHandle в клиентском объекте ...

var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
// Rule that allows anybody in the "Users" group to synchronize with us...
var rule = new EventWaitHandleAccessRule(users, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify, AccessControlType.Allow);
var security = new EventWaitHandleSecurity();
security.AddAccessRule(rule);

Boolean created;
eventWaitHandleForCommands = new EventWaitHandle(
    true,
    EventResetMode.ManualReset, // Ignored.  This instance doesn't reset.
    "MyEventWaitHandle78AEE98", // Unique name
    out created,
    security                    
    );

Вот код, который открывает EventWaitHandle в рабочем объекте ...

handleDomeCommand = EventWaitHandle.OpenExisting("MyEventWaitHandle78AEE98");

Вот исключение, которое происходитв этой строке при запуске на машине Acer Aspine ...

Exception = WaitHandleCannotBeOpenedException
Message = "No handle of the given name exists"
HResult = 8013152C

Теперь это становится более интересным ... вспомните, что я упоминал и об использовании MMF?Итак, я закомментировал EventWaitHandle.OpenExisting (), чтобы рабочий объект мог перейти к открытию MMF с помощью следующего вызова ...

memMappedFile = MemoryMappedFile.OpenExisting("MyMMF_78AEE98", MemoryMappedFileRights.ReadWrite);

, который затем взрывается с исключением ниже, но только наэтот компьютер (около ста других установок это нормально!) ...

Exception = System.IO.FileNotFoundException
Message = "Unable to find the specified file"
HResult = 80070002

Кстати, MMF был создан в объекте клиента следующим образом ...

MemoryMappedFileSecurity CustomSecurity = new MemoryMappedFileSecurity();
CustomSecurity.AddAccessRule(new
        AccessRule<MemoryMappedFileRights>("everyone", MemoryMappedFileRights.FullControl, AccessControlType.Allow));
mmfDome = MemoryMappedFile.CreateNew("MyMMF_78AEE98", MMF_CommandOffsets.MMF_Size,
        MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, CustomSecurity, System.IO.HandleInheritability.Inheritable);

Итак, кажется, что этот компьютер сглазил , но Я был достаточно вокруг, чтобы знать, если это проблема с одним клиентом, за которым последуют другие.

Другие вещи, которые я пробовал ...

  • Попытка установки платформ MS Visual Studio Solution с «Любого процессора» на x86.Не помогло.
  • Думая, что такое поведение может быть связано с очень медленным ПК Acer Aspine, и ядро ​​OS / NET, возможно, не удосужилось создать EventWaitHandle к тому времени, когда мой рабочий объект открыл его, Я поместил 4 последовательных всплывающих окна с сообщениями между созданием и "открыть существующее" ... не помогло.
  • Включение / выключение антивируса Norton ... не помогло.
  • Установите антивирус Norton на другом ПК ... моя программа работает нормально с Norton на этом другом ПК.
  • Запуск от имени администратора ... не помог *
  • Пробовал ставить "Global"\ "перед именем EventWaitHandle ... не помогло.

Итак, ищем предложения / мысли.Спасибо!/ Chris

...