Bien le bonjour,
C'est un sujet qui à été maintes et maintes fois discutés, mais j'aimerai quand même en reparler un peu.
je suis contraint, par la hiérarchie (et non pas techniquement), d'essayer de trouver un moyen de faire l'instanciation de fenêtres dans un thread en arrière plan. En fait, le constat est que la méthode "InitializeComponent" générée par le designer peut être assez longue. En conséquence on souhaite qu'elle se fasse dans un thread d'arrière plan pour ne pas figer l'interface graphique.
Un BackgroundWorker donc.
J'entends déjà "Oula mais non on ne peut pas, tout être fait dans le thread de l'interface graphique".
Mais si on peut le faire. En réalité, ce qui empêche de le faire c'est le fait que les BackgroundWorker fonctionnent avec un ThreadPool, et les threads contenus sont forcément des MTA, alors qu'il faut que l'instance soit créée sur un thread STA. Mais si on utilise un thread créé manuellement, en spécifiant qu'il est en STA, on arrive à instancier un formulaire (et donc appeler le InitializeComponents).
Mon problème se pose alors dans le dispose du formulaire et non plus dans la création.
En effet, certains composants (pas tous) se plaignent que le dispose est fait dans un thread autre que celui qui à créé le composant.
Une idée de comment palier à ce problème ?
Il est évident que le thread qui à servi à créé le formulaire n'existe plus depuis longtemps lorsque le dispose est fait.
En l'occurence, le contrôle qui aime pas pour le moment c'est un RichTextControl. Mais si je prend un formulaire qui ne contient que 2 boutons et un textbox, pas de problème.
Donc voila, si quelqu'un à une idée de comment résoudre ce problème, ou à défaut une explication détaillée de pourquoi ce n'est pas possible, etc...
Partager