2017-05-06 3 views
0

Une application WinForms n'exécute pas Application.Run(Form) immédiatement au démarrage. Il initialise d'abord certaines variables, en accédant aux paramètres de la ligne de commande, à l'API de configuration de l'application, à d'autres données externes et en particulier aux formulaires (par exemple un formulaire de connexion) instancié (et configuré en passant certaines des valeurs précédemment définies).) avec using et affiché avec ShowDialog.Toutes les fenêtres de l'application WinForms partagent-elles le même fil?

Ensuite, il exécute Application.Run(Form) pour afficher le formulaire principal, mais le formulaire principal peut afficher d'autres formulaires (principalement avec ShowDialog) à son tour. Tous les formulaires sont définis dans une bibliothèque de classes distincte. Beaucoup d'entre eux (les fenêtres) doivent accéder aux objets instanciés dans le Program.Main(string[] args) (oui, j'ai ajouté la partie string[] args même si les applications WinForms créées avec Visual Studio ne l'ont pas par défaut) et passent des objets les uns aux autres; Cela m'inquiète au sujet de la sécurité des threads, mais l'idée de base que j'ai à propos du concept «thread UI» suggère que mes inquiétudes pourraient être fausses.

Alors, faire toutes les fenêtres (Form instances) instanciés et représentés par le même processus d'application WinForms partagent le même thread d'interface utilisateur (sauf si je mets le code instanciation/les montrant dans un mode asynchrone couru Task ou quelque chose comme ça explicitement bien sûr)? Ou devrais-je réellement utiliser des techniques spéciales (des suggestions spécifiques sont appréciées) pour transmettre des données entre eux en toute sécurité?

Répondre

3

Il est un peu difficile de répondre à votre question, car il pourrait toujours y avoir "... mais je crée des discussions ici et là ..." se cache que vous ne nous dites pas.

Cependant, sauf cela, alors oui. Une application Winforms utilisera 1 thread pour son interface utilisateur et tout le code environnant.

Sachez que si vous commencez à déblayage à propos de ce qui suit:

  • Task.Run
  • classe Thread
  • BackgroundWorker

alors ma réponse passe par la fenêtre.