Comment puis-je accéder à des variables à partir d'un autre thread?
D'erreur: inter-threads non valide: le Contrôle 'label1' accessible à partir d'un thread autre que le thread qu'il a été créé.
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
string CONNECTING = "Connecting to server...";
string GETTING_DATA = "Getting data...";
string CONNECT_FAIL = "Failed to connect!";
string CONNECT_SUCCESS = "Connection established!";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Thread t1 = new Thread(run);
t1.Start();
}
public void run() {
label1.Text = CONNECTING;
}
}
}
Comment résoudre ce problème? J'ai essayé d'utiliser CheckForIllegalCrossThreadCalls = false;
mais que de toute évidence les causes des erreurs.
J'aimerais aussi savoir comment je peux arrêter le fil, car il ne peut pas être plus accessible à l'extérieur de la fonction.
Merci d'avance!
- ce n'est pas une variable globale, et vous devriez l'appeler
- Comment dois-je procéder?
- double possible de inter-threads non valide
Vous devez vous connecter pour publier un commentaire.
De l'accès à un contrôle de différents threads
Dans
WinForms App
vous pouvez ony accéder directement à unControl
le fil il a été créé.Pour accomplir cette tâche, vous aurez besoin d'utiliser InvokeRequired propriété d'un contrôle pour voir si vous devez utiliser Invoquer afin de forcer un appel à l'action à partir du fil d'origine.
Une méthode publique qui peut être consulté à partir de n'importe quel thread, y compris l'original devrait ressembler à ceci:
Mais si vous êtes absolument sûr que
run()
méthode sera appelée seulement à partir du thread, envisager de ne pas même vérifier siInvokeRequired
et immédiatement appelInvoke
Plus d'informations: http://msdn.microsoft.com/en-us/library/ms171728(v=vs. 80).aspx
L'arrêt d'un thread en cours
Simples est d'utiliser t1.Abort(); méthode de
Thread
. Cela permettra de lancer des exceptions et les forçant à s'arrêter à l'endroit où il était. ce qui est excellent pour les threads qui ne font pas tout à long de traitement afin d'éviter qu'elle ne causera pas de problèmes.Si vous le faites proccesing dans votre fil, ce qui signifie que vous ne pouvez pas arrêter dans le milieu alors je vous suggérons d'utiliser une valeur de type boolean qui indique que le thread doit annuler le plus tôt possible.
Essayez d'utiliser BeginInvoke:
Seul le thread d'INTERFACE utilisateur peut mettre à jour des éléments d'INTERFACE utilisateur dans une application Windows Forms. Les autres threads besoin d'utiliser BeginInvoke de mettre à jour l'INTERFACE utilisateur.
ORIGINAL: j'ai supposé que c'était une application WPF, et dit d'utiliser ce.Répartiteur, mais Répartiteur n'est pas dans les Windows Forms apps.