2009-10-28 6 views

Répondre

3

Il y a un fil pour toutes les formes.

En fait, Windows Forms (et la plupart des technologies de fenêtrage), nécessitent que tous vos formulaires et contrôles soient générés sur un seul thread. Si vous essayez d'utiliser un contrôle provenant d'un thread différent, cela causera un problème.

L'unité d'exécution de l'interface utilisateur d'une application Windows passe en réalité la majeure partie de son temps inactive. Une file d'attente de messages est traitée et provoque le déclenchement des événements que vous gérez. Si vous souhaitez accéder à l'interface utilisateur à partir d'un autre thread, vous devez appeler (en utilisant Control.Invoke) la méthode que vous souhaitez exécuter sur le thread de l'interface utilisateur, sinon vous recevrez des exceptions.

+0

Qu'est-ce que ce code va faire? \t \t nouvelle discussion (nouveau ThreadStart (délégué() \t \t { \t \t \t forme f = nouveau formulaire(); \t \t \t f.Show();} \t \t)). Démarrer(); –

+2

Comme je l'ai commenté dans un autre post - vous pouvez le faire. Cependant, votre code, comme ci-dessus, provoquera une énorme quantité d'instabilité, et probablement crash. Si vous voulez faire cela, vous devriez faire Application.Run (new Form1()) à l'intérieur du thread, ET assurez-vous que le thread est défini sur l'état d'appartement Single Thread avant d'appeler Start. Si vous faites cela, vous pouvez démarrer une nouvelle pompe de message sur un thread secondaire et l'exécuter. Ce n'est simplement pas la façon de travailler «normale» ou une bonne pratique. –

+0

Chaque fenêtre a une affinité avec le thread qui l'a créée - tout le traitement des messages pour la fenêtre aura lieu dans ce thread, et certains toolkits de widgets (y compris WinForms) limitent sévèrement les opérations effectuées à partir d'autres threads. Mais accéder à partir du thread qui a créé la fenêtre est considérablement plus flexible que d'avoir un seul thread d'interface utilisateur. –

0

Non, Ce n'est qu'une file d'attente de messages. Les formulaires (windows) semblent être "multithread", mais il s'agit d'une file d'attente de messages/d'une pompe de message qui traite les messages. (donc c'est 1 thread ...)

1

Si vous ne faites rien de plus, toutes les formes partagent le même thread d'interface utilisateur (je suppose que c'est ce que vous faites référence)

+0

Toutefois, si vous utilisez wpf, vous pouvez avoir un thread ui distinct pour chaque formulaire. Voir cet article pour plus de détails: http://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui-threads/ – anchandra

+0

Il est techniquement possible de le faire aussi dans Windows Forms - Il suffit d'avoir plusieurs appels Application.Run dans les threads STA - mais ce n'est généralement pas nécessaire ou une bonne idée, IMO. –