Кто-нибудь сталкивался с такой ситуацией? У меня есть событие в VB6, которое обрабатывается в библиотеке c #, которая подключена вот так.
В ctor:
_EventHandler = new __MyObj_Event_EventHandler(_MyObj_Event);
Когда это необходимо:
_MyObj.Event += _EventHandler;
_MyObj.DoSomthingThatResultsInTheEvent;
В обработчике:
private void _MyObj_Event()
{
_MyObj.Event -= _EventHandler;
//Do Something
}
В VB6 он объявлен и поднят обычным способом, и я использую встроенные типы взаимодействия для импорта DLL. Я добавил логирование до и после вызова RaiseEvent и внутри обработчика событий. Я ожидаю увидеть последовательность:
BeforeRaise-> Обработчик-> AfterRaise
но на некоторых машинах я вижу, что вызов VB6 RaiseEvent, похоже, не блокируется, а записываемая последовательность:
BeforeRaise-> AfterRaise-> Обработчик
Теперь я должен иметь дело только с одним потоком, и если я запускаю библиотеку VB6 в режиме отладки на проблемной машине, проблема не возникает.
Это связано с другим активным вопросом, который у меня есть Событие VB6, передающее аргумент bool, который всегда 'true' в C # Поскольку описанная в этом вопросе проблема возникает только тогда, когда возникает проблема, описанная в этом вопросе.
Кто-нибудь еще испытывал это? Могу ли я как-то объявить делегат события по-другому или использовать GC, чтобы убедиться, что он каждый раз свежий или что-то еще? Почему это происходит только на нескольких случайно выбранных машинах?