#c# #com-interop #deadlock #contextswitchdeadlock
#c# #совместное взаимодействие #взаимоблокировка #contextswitchdeadlock
Вопрос:
Код C # извлекает значение свойства из библиотеки dll C , и это извлечение блокирует текущий поток до тех пор, пока библиотека dll не вернет значение. В режиме отладки, когда поиск занимает много времени, MDA выдает ContextDeadlockSwitch.
Я полагаю, что невозможно перехватить ContextDeadlockSwitch во время выполнения, но есть ли способ, которым механизм, подобный MDA, может выдавать аналогичное исключение, которое C # может перехватить для обнаружения этой взаимоблокировки?
Причина в том, чтобы позволить коду C # запрашивать пользователя либо продолжить ожидание еще на несколько секунд, либо принудительно завершить работу и перезапустить приложение.
Ответ №1:
Вы могли бы выполнить вызов библиотеки dll C в другом потоке, используя ожидание с таймаутом в ManualResetEvent для сигнализации завершения; если таймаут достигнут, вы можете спросить пользователя, хочет ли он продолжить. Обратите внимание, что если COM-объект библиотеки DLL находится в STA, вам может потребоваться создать объект в зарезервированном для него месте и маршалировать по нему, чтобы предотвратить замораживание вашего потока GUI, когда он выходит на обед.