Почему вызов неуправляемого кода из потока .NET BackgroundWorker влияет на пользовательский интерфейс?
-
08-07-2019 - |
Вопрос
У меня есть длинная серия операций в потоке .NET 2.0 BackgroundWorker
. Когда я выполняю вызов неуправляемого кода, расположенного в сборке, на которую ссылаются, пользовательский интерфейс останавливается до завершения вызова.
Почему это? Разве я не должен делать эти вызовы из потока BackgroundWorker
?
Да, это COM-компонент, но я не уверен, как определить, является ли он STA или нет, и каковы / могут быть последствия / разрешение. Я делаю несколько звонков на этот компонент, но только в течение длительного времени я замечаю, что интерфейс перестает отвечать на запросы.
Эти вызовы получают данные с сервера.
Решение
У вас есть вопрос о теге COM - вы вызываете компонент COM? Это STA компонент? Если это так, то он может как-то вернуться к выполнению своей работы в потоке пользовательского интерфейса. Я с готовностью признаю, что я далек от того, чтобы быть экспертом в области COM, но я не удивлюсь, если бы это была проблема.
Что произойдет, если вы сделаете вызовы из новой ветки, которую вы явно создали?
Другие советы
Да, а также, происходит ли это со всем неуправляемым кодом или только с конкретным компонентом или API? Если конкретный, что делает этот неуправляемый код?
Кроме того, вы можете просто закомментировать ваш текущий код в BackgroundWorker (вы правильно запускаете RunWorkerAsync ...) и поставить там сон. Если ваш GUI перестает отвечать на запросы, значит что-то не так, иначе код, который вы вызываете, как указывает Джон, может быть в случае с COM.