Многопоточность C # с импортированной неуправляемой библиотекой DLL

#c# #multithreading

#c# #многопоточность

Вопрос:

У меня возникла следующая проблема и вопрос.

Прежде всего, мне приходится использовать .NET 3.5. Я разрабатываю DLL, которая используется в многопоточном хост-приложении.

Моя новая DLL загружает DLL с помощью функции DllImport. Эта импортированная DLL действительно старая и, насколько мне известно, не обеспечивает многопоточность. Она предоставляет функции для открытия аппаратного порта USB и функции для запуска чтения ДАННЫХ.

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

Я начал использовать это приложение в своей DLL, и иногда это работает. После отладки я на самом деле пришел к выводу, что это проблемы с многопоточностью, приложение хоста является не только многопоточным, но и мультисервисным.

Я начал внедрять многопоточность в демонстрационном приложении. И обнаружил, что я с этим не знаком. Я использую объект lock, чтобы гарантировать, что аппаратная связь не выполняется параллельно. но потоки заблокировали друг друга, также без внешней DLL.

Прежде всего, Mainthread теперь является одним из моих потоков, и из этого запускается новый созданный поток, который предваряет сборку результатов аппаратного сканирования для имитации неизвестной аппаратной связи в моем хост-приложении, в котором запущена моя dll.

через некоторое время приложение зависает и ожидает получения блокировки, это происходит в MainThread, которое невозможно воспроизвести. Возможно ли вообще использовать блокировку в MainThread? Или MainThread должен быть нетронутым, запущенным все время?

Извините, что я не могу предоставить код, но я надеюсь, что кто-нибудь понимает и может дать подсказку для решения проблемы.

Если мне придется использовать, возможно, версию 4.5 .net, мне понадобится некоторая информация для загрузки внешней DLL, я попробовал это и получил проблемы с функцией DllImport.

Спасибо, что прочитали и подумали об этом.

Комментарии:

1. Если USB-устройство не поддерживает параллельные операции, то вам необходимо управлять тем, как ваше приложение обращается к нему. В настоящее время вы внедрили механизм блокировки, но он не работает. Без кода трудно определить, почему. Рассмотрите возможность создания класса-оболочки с одноэлементным шаблоном, который управляет доступом к USB-устройству.

2. Добро пожаловать в StackOverflow. Пожалуйста, поделитесь своим кодом, а также описанием проблемы. Трудно устранять проблемы, читая краткий обзор. Пожалуйста, также не забудьте указать, где возникают ошибки.