Обнаружить ContextDeadlockSwitch во время выполнения

Код A C# извлекает значение свойства из DLL C++, и этот поиск блокирует текущий поток, пока dll не вернет значение. В режиме отладки, когда получение занимает много времени, MDA генерирует ContextDeadlockSwitch.

Я предполагаю, что невозможно перехватить ContextDeadlockSwitch во время выполнения, но есть ли способ, чтобы механизм, подобный MDA, мог выдать подобное исключение, которое C# может перехватить, чтобы обнаружить эту тупиковую ситуацию?

Причина состоит в том, чтобы позволить C# коду предложить пользователю либо продолжать ждать еще несколько секунд, либо принудительно убивать и перезапускать приложение.

1 ответ

Решение

Вы можете выполнить вызов в dll C++ в другом потоке, используя ожидание с таймаутом на ManualResetEvent, чтобы сигнализировать о завершении; по истечении времени ожидания вы можете спросить пользователя, хотят ли они продолжить. Обратите внимание, что если COM-объект DLL находится в STA, вам может потребоваться создать объект в квартире, зарезервированной для него, и выполнить маршалл, чтобы предотвратить его замораживание потока GUI, когда он выходит на обед.

Другие вопросы по тегам