Perché una chiamata a codice non gestito da un thread .NET BackgroundWorker influisce sull'interfaccia utente?

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

  •  08-07-2019
  •  | 
  •  

Domanda

Ho una lunga serie di operazioni in un thread .NET 2.0 BackgroundWorker . Quando eseguo una chiamata a codice non gestito situato in un assembly a cui viene fatto riferimento, l'interfaccia utente viene bloccata fino al completamento della chiamata.

Perché questo? Non dovrei effettuare queste chiamate dal thread BackgroundWorker ?


Sì, è un componente COM ma non sono sicuro di sapere se è STA o meno e quali sono / sono le implicazioni / risoluzione. Faccio diverse chiamate a quel componente ma sono solo quelle di lunga durata in cui noto che l'interfaccia utente non risponde.

Queste chiamate recuperano i dati da un server.

È stato utile?

Soluzione

Hai il tag COM nella domanda: stai chiamando in un componente COM? È un componente STA? In tal caso, potrebbe essere il marshalling di nuovo a fare il suo lavoro sul thread dell'interfaccia utente in qualche modo. Ammetterò prontamente che sono ben lungi dall'essere un esperto di cose COM, ma non sarei sorpreso se questo fosse il problema.

Cosa succede se si effettuano le chiamate da un nuovo thread che hai creato esplicitamente?

Altri suggerimenti

Sì e anche, questo accade con tutto il codice non gestito o solo un componente specifico o API? Se specifico, cosa sta facendo quel codice non gestito?

Inoltre, potresti semplicemente commentare il tuo codice corrente in BackgroundWorker (stai eseguendo RunWorkerAsync nel modo giusto ...) e mettere un sonno lì dentro. Se la tua GUI non risponde, qualcosa non va, altrimenti è il codice che stai chiamando, come sottolinea Jon, potrebbe essere il caso di COM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top