2009-04-13 5 views
8

Je sais que je peux démarrer un nouveau thread de travail à partir de .NET. Mais comment puis-je démarrer un nouveau thread UI (comme dans MFC)? Cela ne me dérange pas si la solution est limitée aux boîtes Windows seulement; Je voudrais également que la solution soit purement. NET - pas p/appelle à CreateThread, etc.Comment démarrer un thread d'interface utilisateur en C#

Toute entrée appréciée.

Répondre

24

Utiliser Application.Run - il démarre une boucle de message dans le thread en cours. Il y a des surcharges à prendre avec un formulaire, ou un contexte d'application, ou aucune. (Si vous voulez faire cela pour un nouveau thread, vous devez créer le fil et le lancer de façon normale, et faire appel Application.Run.)

+0

Comment Application.Run comparer avec ShowDialog, qui est l'approche que je l'ai utilisé avant? – supercat

+0

@supercat: Appelez-vous 'ShowDialog' d'un thread non-UI alors? Je ne suis pas sûr de l'effet dans ce cas. –

+1

Ouais, j'appelle ShowDialog à partir d'un thread non-UI; l'effet apparent est que la nouvelle fenêtre ainsi créée aura un thread UI indépendant du thread UI de toute autre fenêtre. Cela semble bien fonctionner à condition que la fenêtre n'essaie pas d'interagir avec des contrôles sur d'autres threads, et à condition qu'elle n'essaie pas de définir son MdiParent sur une fenêtre exécutée sur un autre thread. – supercat

2

Si vous cherchez à créer un nouveau fil qui est capable de créer et gérer des poignées de fenêtre, vous pouvez utiliser la fonction SetApartmentState sur l'objet Thread et le définir sur STA. Vous devrez également appeler Application.Run à l'intérieur de la méthode pour ce thread afin de créer votre boucle de message. Cependant, gardez à l'esprit que vous êtes soumis aux mêmes non-noeuds que vous avez dans n'importe quel autre thread (ie, vous ne pouvez interagir avec le handle que pour un contrôle sur le thread dans lequel il a été créé), donc vous ne pouvez rien faire sur votre autre thread d'interface utilisateur sans changer de contexte.

4

Si vous souhaitez utiliser WPF, consultez l'article MSDN WPF's Threading Model, en particulier la section «Plusieurs fenêtres, plusieurs threads». Il détaille ce que vous devez faire pour créer un nouveau Dispatcher et afficher une fenêtre sur un nouveau thread.

+0

Super article, merci :) – Tom

0

Aussi, vous pouvez le faire:

delegate void MyProcHandler(object param1, object param2); 

    MyForm.Invoke 
    (
      new MyProcHandler(delegate(object param1, object param2) 
      { 
      // some code 
      }), 
      null, 
      null 
    ); 
Questions connexes