Резюме: 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