Comment une nouvelle Forme d'être exécuté sur un autre thread en C#?
Je suis juste en train de lancer un nouveau thread à chaque fois qu'un clic sur un bouton de même se produit, ce qui devrait créer une nouvelle forme. J'ai essayé ceci dans l'événement click du bouton dans la MainForm:
private void button1_Click(object sender, EventArgs e)
{
worker1 = new Thread(new ThreadStart(thread1));
worker2 = new Thread(new ThreadStart(thread2));
worker1.Start();
worker2.Start();
}
private void thread1()
{
SubForm s = new SubForm();
s.Show();
}
private void thread2()
{
SubForm s = new SubForm();
s.Show();
}
Le code dans le sous-Formulaire à l'événement clic du bouton qui va comme ceci:
private void button1_Click(object sender, EventArgs e)
{
int max;
try
{
max = Convert.ToInt32(textBox1.Text);
}
catch
{
MessageBox.Show("Enter numbers", "ERROR");
return;
}
progressBar1.Maximum = max;
for ( long i = 0; i < max; i++)
{
progressBar1.Value = Convert.ToInt32(i);
}
}
Est-ce la bonne manière? Parce que j'essaie d'ouvrir deux formes indépendantes, des opérations dans un thread ne devrait pas affecter les autres fil.
Ou BackGroundworker est la solution à mettre en œuvre? Si oui, quelqu'un peut m'aider avec ça?
Je pensais que Windows applications n'ont qu'un seul GUI boucle d'événement par processus? Ainsi, tous les trucs de l'INTERFACE utilisateur doivent être faites dans le thread principal? (CMIIW)
J'ai eu cette idée aussi.
quel problème vous avez spécifiquement essaie de résoudre?
Il n'y a pas de "fil conducteur", et un thread peut s'exécuter sa propre boucle de message.
double possible de Pourquoi mon Fil de Résilier Immédiatement Après la présentation d'un Formulaire Windows? Aussi: stackoverflow.com/questions/2428530/... et stackoverflow.com/questions/3012795/...
J'ai eu cette idée aussi.
quel problème vous avez spécifiquement essaie de résoudre?
Il n'y a pas de "fil conducteur", et un thread peut s'exécuter sa propre boucle de message.
double possible de Pourquoi mon Fil de Résilier Immédiatement Après la présentation d'un Formulaire Windows? Aussi: stackoverflow.com/questions/2428530/... et stackoverflow.com/questions/3012795/...
OriginalL'auteur SLp | 2010-08-14
Vous devez vous connecter pour publier un commentaire.
Bien que je ne suis pas à 100% au courant de tout ce qui dit de courir complètement séparée des formes faisant totalement isolés dans leur propre fils est dangereux en quelque sorte, l'exécution de toutes les opérations de l'INTERFACE utilisateur sur un seul thread est généralement considéré comme une bonne pratique.
Vous pouvez soutenir ce, simplement en ayant votre sous-Formulaire classe BackgroundWorker. Lorsque le formulaire est affiché, le coup d'envoi de la BackgroundWorker de sorte qu'il traite tout ce dont vous avez besoin.
Alors vous pouvez simplement créer de nouvelles instances de votre sous-Formulaire sur votre thread GUI et de leur montrer. Le formulaire s'affichera et de commencer son opération sur un autre thread.
De cette façon, l'INTERFACE utilisateur sera en cours d'exécution sur le thread GUI, mais les opérations les formes sont en cours d'exécution seront en cours d'exécution sur le pool de threads les threads.
Mise à jour
Voici un exemple de ce que votre arrière-plan travailleur gestionnaires pourrait ressembler à noter que (comme d'habitude), c'est juste à côté de ma tête, mais je pense que vous pouvez obtenir votre tête autour des principes de base.
Ajouter un BackgroundWorker à votre formulaire nommé travailleur. De le raccorder à des gestionnaires d'événements suivants:
Votre gestionnaire de clic ressemblerait à quelque chose comme:
J'espère que ça aide.
J'ai mis à jour avec des exemples de code - j'espère que cela vous donne une idée de comment utiliser le composant BackgroundWorker.
Merci Mr Alex. Votre aide est d'une grande utilité pour les gens comme moi.
Alex: j'ai essayé et ça marche. Je vous remercie beaucoup. J'ai utilisé " de l'Application.Exécuter(s); ' au lieu de s.montrons que j'ai utilisé à l'origine et " Int32.TryParse' ne semble pas le travail", Pas de surcharge de méthode TryParse' prend '1' arguments ' est l'erreur que j'obtiens. J'ai cherché la solution. J'ai déclaré " max "comme" int "et j'ai utilisé" Int32.TryParse". Mais j'ai toujours cette erreur. neway, mon Principal doute quant à l'interface graphique de formulaire est résolu. Merci à vous tous.
La raison je l'ai dit, l'utilisation Int32.TryParse est de sorte que vous pouvez éviter d'avaler des exceptions. Utilisez quelque chose comme int max = 0; if(Int32.TryParse(textBox1.Texte, max)){ // le Texte est un entier. } else { // le Texte n'est pas un entier valide. } - et pourriez-vous cliquez sur la coche en regard de la réponse choisie de sorte que les gens avec le même problème lors de la lecture de votre question peut identifier la meilleure approche? Des acclamations.
OriginalL'auteur Alex Humphrey
Vous n'avez pas besoin d'exécuter des formulaires dans des threads séparés. Vous pouvez les appeler
s.Show()
sur de multiples formes normalement. Ils ne vont pas se bloquer les uns les autres.Bien sûr, si vous êtes en train de faire autre chose, comme une sorte de calcul ou toute autre tâche qui prend beaucoup de temps, alors vous devez exécuter que dans un thread séparé, mais pas la forme.
Voici un peu de code qui vous permettra de créer une barre de progression qui montre les progrès d'un long processus. Notez que chaque fois accès à la forme de l'intérieur du fil, vous devez utiliser
.Invoke()
, qui, de fait, les horaires de l'invocation à exécuter sur le thread GUI quand il est prêt.Timwi: Désolé je n'ai pas voir votre mise à jour de la première fois. Donc, c'est ce que j'essaie de faire exactement 'exécuter dans un thread séparé, mais pas la forme" comme tu dit, mais im me demandais comment? désolé, im nouveau à cela et je viens de commencer l'apprentissage.
le conseillé chose à faire est de ne pas courir le long processus dans le SubForm1, mais plutôt courir ce long processus dans un BackgroundWorker (ou Thread, mais BackgroundWorker fait thread GUI interaction plus facile à gérer.) Sinon, vous êtes prise de SubForm1 non-réactif, ce qui conduit à laide dessin artefacts (pas de repeindre), parmi d'autres choses.
J'ai posté un exemple de code dans la réponse.
Timwi: Merci beaucoup. Je l essayer.
OriginalL'auteur Timwi
De l'essayer. Il exécute le nouveau Formulaire dans son propre thread avec ses propres files d'attente de messages et de ce pas.
Exécutez ce code:
Utilisation
Thread.CurrentThread.GetHashCode()
de test s'exécute sur l'autre thread.OriginalL'auteur Willie Visagie
Il est possible d'exécuter différentes formes sur des threads différents. Il y a deux bémols, je suis conscient de:
Bien évidemment, il est souhaitable de ne pas avoir de fenêtre du thread d'INTERFACE utilisateur bloqué, mais en utilisant des threads séparés pour windows distinct peut être une bonne alternative.
OriginalL'auteur supercat