Обработка застрявшего вызова из управляемого в неуправляемый код - PullRequest
0 голосов
/ 16 апреля 2020

Справочная информация: у нас есть приложение C#, которое связывается с физическим устройством через неуправляемую DLL через ethe rnet. После запуска чтение l oop начинается в отдельной задаче в приложении C#. Это l oop вызывает неуправляемый метод, который затем запрашивает данные на FPGA на устройстве и возвращает их в основное приложение. Этот l oop должен быть максимально быстрым (обертка каждого вызова в другой задаче или потоке недопустима). К сожалению, неуправляемый метод чтения данных не имеет тайм-аута.

Проблема: после запуска чтения l oop мы отключаем устройство для имитации потери связи (либо отключаем ethe rnet кабель или выключите устройство). Если в этот момент чтение l oop было в середине неуправляемого вызова, оно застревает и никогда не возвращается из-за отсутствия тайм-аута. Приложение C# знает, что должно прекратить его, но не может этого сделать.

Что мы пробовали: Задача, выполняющая чтение l oop, не может быть отменена, потому что она никогда не приходит до точки проверки, должен ли он выйти. Thread.Abort (), хотя и является плохой идеей, также не будет работать. Мы не можем получить доступ и изменить неуправляемую DLL, чтобы добавить тайм-аут. Выполнение чтения l oop в другом домене процесса / приложения возможно, но ужасно сложно (l oop вызывает события и передает данные много раз в секунду), и, если есть какая-либо другая возможность, следует избегать.

Вопрос: есть ли чистый способ справиться с этой ситуацией, кроме запуска l oop в отдельном процессе и полного его уничтожения, если он застрял? Помимо того, что это сложно сделать для нас, он также чувствует себя ... неправильно.

Если требуются дополнительные разъяснения, не стесняйтесь сказать мне.

...