Ajouter un contrôle sur un formulaire, à partir d'un autre Thread
J'étais en train d'essayer de retarder l'ajout de contrôles à mon formulaire principal, avec un objectif de vitesse, c'est l'heure de démarrage. Eh bien, je suis à court d'exception suivante:
Inter-threads non valide:
Contrôle 'Form1' accessible à partir d'un thread
autre que le thread qu'il a été créé
sur.
J'ai essayé de simplement le problème sur un petit exemple, mais le problème reste. Voici mon code:
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
namespace AddConrolFromAnotherThread {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void AddButton() {
if(this.InvokeRequired){
this.Invoke(new MethodInvoker(this.AddButton));
}
Random random = new Random(2);
Thread.Sleep(20);
Button button = new Button();
button.Size = new Size(50,50);
button.Location =
new Point(random.Next(this.Width),random.Next(this.Height));
this.Controls.Add(button);
}
private void buttonStart_Click(object sender, EventArgs e) {
Thread addControlThread =
new Thread(new ThreadStart(this.AddButton));
addControlThread.Start();
}
}
}
J'ai utilisé la méthode Invoke et n'vérifier si InvokeRequiered est vrai, mais InvokeRequiered garder à rester "vrai". Je ne comprends vraiment pas cela. On pouvait au moins s'attendre à StackOverflow exception, puisque c'est une récursivité appel.
Donc, si quelqu'un a rencontré le même problème, s'il vous plaît pourriez-vous me dire ce que je n'ai fait de mal?
Vous devez vous connecter pour publier un commentaire.
Le problème dans ton code, c'est que vous êtes à l'ajout de deux boutons.
Mettre le code après le si le bloc dans un bloc else.
Vous pouvez le faire comme....
Utiliser des méthodes anonymes à la place. Explication ci-dessous.
Si nous avons formulaire comme ceci:
Cette lèvera une exception.
Changement UpdateText pour:
ou utiliser la méthode anonyme:
Il est très coûteux d'utiliser un thread pour le simple ajout d'un bouton ! Utiliser le pool de threads au lieu.