Plusieurs Threads UI - Winforms
Je veux créer plusieurs threads UI dans mon application. J'ai simulé le scénario ci-dessous. Je suis en création d'une nouvelle fenêtre /forme sur un bouton de la souris dans un fond fil
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var thread = new Thread(() =>
{
Form f = new Form();
Application.Run(f);
});
//thread.IsBackground = true; -- Not required. See Solution below
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
}
}
Remarque que je suis en train de faire IsBackground = true parce que lorsque l'utilisateur ferme sur le formulaire principal, l'enfant forme/windows devrait également fermer. Est-il plus propre/gracieuse façon d'obtenir les mêmes ?
EDIT - je veux créer dédié threads UI pour chaque fenêtre. Je vais
10 windows affichage en temps réel des données en parallèle.
Solution - Est-ce bien ? (comme par msdn et Hans commentaires ci-dessous)
ont mis l'Appartement de l'état (voir le code ci-dessus)
protected override void OnClosed(EventArgs e)
{
Application.Exit();
}
Pourquoi avez-vous encore besoin d'un autre thread? Il suffit de créer le formulaire sur le thread principal, puis appeler
f.Show()
.Il y a plusieurs façons de contourner cela. Cependant, comme @Ramhound déjà mentionné, vous avez probablement envie de prendre un coup d'oeil à
BackgroundWorker
, parce qu'il l'ait quelques beaux événements. - Une solution de rechange pourrait être Task
.svick - je veux créer dédié threads UI pour chaque fenêtre. Je vais avoir 10 windows affichage en temps réel des données en parallèle.
Assez rare d'avoir une machine avec 10 coeurs de cpu. Thread Appelant.SetApartmentState() est nécessaire. Si vous voulez arrêter proprement, alors vous aurez à stocker les formulaires dans une Liste<>, de sorte que vous pouvez f.Invoke() un appel à Candidature.Exit(). L'affichage des fenêtres sur plusieurs threads n'est presque jamais pas une erreur. Les fenêtres n'ont pas de Z-ordre de la relation et de façon arbitraire disparaître derrière la fenêtre d'une autre application.
OriginalL'auteur Angshuman Agarwal | 2011-09-27
Vous devez vous connecter pour publier un commentaire.
De jouer avec les threads ne mordent que vous tôt ou tard.
À partir de MSDN:
Vous pouvez bien sûr utiliser autant de threads que vous voulez, mais n'essayez pas de créer une solution de contournement pour être en mesure d'utiliser des threads différents pour la mise à jour de l'INTERFACE utilisateur. Utilisation
Invoke
/InvokeRequired
de votre travailleur/threads d'arrière-plan à la place.À l'aide d'une méthode d'extension rend plus propre: L'automatisation de la InvokeRequired du modèle de code
Ces formes sera fermé si vous commencer à traiter de fils de la bonne façon (et pas la solution à votre question)
OriginalL'auteur jgauffin
Je pense que vous aurez besoin de mettre l'appartement de l'état de votre thread thread unique, comme indiqué ici Pour les nuls n' et ici Forme Thread-safe.Montrer:
t.SetApartmentState(ApartmentState.STA)
. Je ne sais pas si c'est possible de faire sur un thread d'arrière-plan.Une autre chose que je vous invite à regarder est le MDI (multiple document interface, par exemple ici). Avez-vous vraiment besoin de différentes formes d'affichage dans le cadre d'une fenêtre ou sont-ils plutôt des documents à l'intérieur d'une forme commune? Vous pouvez avoir bien sûr une raison pour créer plusieurs threads UI.
+1 pour le personnel de l'appartement
blogs.msdn.com/b/larryosterman/archive/2004/04/28/122240.aspx - donne un bon résumé sur MTA/STA
OriginalL'auteur Andreas
Vous pourriez gérer la MainForm.Cérémonie de clôture et appel de sous-formulaire.Fermer ( triées sur le fil de droite ) pour chaque sous forme.
Je ne suis pas sûr de savoir pourquoi vous voulez les formes sur des threads séparés. Tu ne peux pas afficher les sous-formulaires non modal sur le thread principal?
OriginalL'auteur Nicholas Butler