Почему вызов неуправляемого кода из потока .NET BackgroundWorker влияет на пользовательский интерфейс?

StackOverflow https://stackoverflow.com/questions/283241

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть длинная серия операций в потоке .NET 2.0 BackgroundWorker . Когда я выполняю вызов неуправляемого кода, расположенного в сборке, на которую ссылаются, пользовательский интерфейс останавливается до завершения вызова.

Почему это? Разве я не должен делать эти вызовы из потока BackgroundWorker ?

<Ч>

Да, это COM-компонент, но я не уверен, как определить, является ли он STA или нет, и каковы / могут быть последствия / разрешение. Я делаю несколько звонков на этот компонент, но только в течение длительного времени я замечаю, что интерфейс перестает отвечать на запросы.

Эти вызовы получают данные с сервера.

Это было полезно?

Решение

У вас есть вопрос о теге COM - вы вызываете компонент COM? Это STA компонент? Если это так, то он может как-то вернуться к выполнению своей работы в потоке пользовательского интерфейса. Я с готовностью признаю, что я далек от того, чтобы быть экспертом в области COM, но я не удивлюсь, если бы это была проблема.

Что произойдет, если вы сделаете вызовы из новой ветки, которую вы явно создали?

Другие советы

Да, а также, происходит ли это со всем неуправляемым кодом или только с конкретным компонентом или API? Если конкретный, что делает этот неуправляемый код?

Кроме того, вы можете просто закомментировать ваш текущий код в BackgroundWorker (вы правильно запускаете RunWorkerAsync ...) и поставить там сон. Если ваш GUI перестает отвечать на запросы, значит что-то не так, иначе код, который вы вызываете, как указывает Джон, может быть в случае с COM.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top