Adresse originale : Cliquez pour ouvrir le lien
[Résumé]Cet article présente C#
Bibliothèque de classes Thread pour le développement multithread WinForm et fournit un exemple de code simple pour référence.
Windows est un système multitâche. Si vous utilisez Windows 2000 et supérieur, vous pouvez utiliser le Gestionnaire des tâches pour afficher les programmes et. processus en cours d’exécution sur le système. Qu'est-ce qu'un processus ? Lorsqu'un programme démarre, il s'agit d'un processus. Le processus fait référence au programme en cours d'exécution et aux ressources mémoire et système utilisées par le programme. Un processus est composé de plusieurs threads. Un thread est un flux d'exécution dans le programme. Chaque thread possède son propre registre privé (pointeur de pile, compteur de programme, etc.), mais la zone de code est partagée, c'est-à-dire que différents Threads peuvent s'exécuter. la même fonction. Le multithreading signifie qu'un programme contient plusieurs flux d'exécution, c'est-à-dire que plusieurs threads différents peuvent être exécutés simultanément dans un programme pour effectuer différentes tâches, ce qui signifie qu'un seul programme est autorisé à créer plusieurs threads d'exécution parallèles pour accomplir leurs tâches respectives.
Dans la bibliothèque de classes du framework .net, toutes les classes liées aux applications de mécanisme multi-threading sont placées dans l'espace de noms System.Threading. Il fournit la classe Thread pour créer des threads, la classe ThreadPool pour gérer les pools de threads, etc. En outre, il fournit également des mécanismes pour résoudre des problèmes pratiques tels que les modalités d'exécution des threads, les blocages et la communication entre les threads. Si vous souhaitez utiliser le multithreading dans votre application, vous devez inclure cette classe. La classe Thread dispose de plusieurs méthodes cruciales, décrites comme suit :
Start() : Démarrer un fil de discussion
Sleep(int) : Méthode statique, met le thread en cours en pause pendant le nombre de millisecondes spécifié
Abort() : Utilise généralement cette méthode Pour terminer un fil de discussion
Suspend() : Cette méthode ne termine pas le fil de discussion inachevé, elle suspend uniquement le fil de discussion et peut être reprise plus tard.
Resume() : Reprendre l'exécution du thread suspendu par la méthode Suspend()
Thread L'entrée permet au programme de savoir quoi laisser ce thread faire. En C#, l'entrée du thread est fournie via le délégué ThreadStart. Vous pouvez comprendre ThreadStart comme un pointeur de fonction, pointant vers la fonction à exécuter par le thread. Thread.Start (), le thread commence à exécuter la fonction représentée ou pointée par ThreadStart.
Les valeurs possibles de ThreadState dans diverses situations sont les suivantes :
Avorté : Le fil de discussion s'est arrêté
AbortRequested : La méthode Thread.Abort() du thread a été appelée, mais le thread ne s'est pas encore arrêté
Contexte : Le thread est en exécution en arrière-plan, lié à la propriété Thread.IsBackground
En cours d'exécution : Le thread s'exécute normalement
Arrêté : Le fil de discussion a été arrêté
StopRequested : Il est demandé au fil de discussion de s'arrêter
Suspendu : Le fil de discussion a été suspendu (dans cet état, il peut être réexécuté en appelant la méthode Resume())
SuspendRequested : Le fil de discussion demande à être suspendu, mais il n'y a pas de temps pour répondre
Non démarré : Thread.Start( ) n'est pas appelé pour démarrer l'exécution du thread
WaitSleepJoin : Le thread est dans un état bloqué en raison de l'appel de méthodes telles que Wait(), Sleep( ) ou Join()
Tout d'abord, vous pouvez regarder la méthode la plus directe, qui est également la méthode prise en charge sous .net 1.0. Mais veuillez noter que cette méthode est déjà une mauvaise méthode après .net 2.0.
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(ThreadFuntion); thread.IsBackground = true; thread.Start(); } private void ThreadFuntion() { while (true) { this.textBox1.Text = DateTime.Now.ToString(); Thread.Sleep(1000); } } }
Ce code lève une exception sur vs2005 ou 2008 : Opération cross-thread non valide : Contrôle 'textBox1' accessible à partir d'un thread autre que le thread il a été créé le. En effet, le mécanisme de sécurité a été renforcé après .net 2.0, ce qui ne permet pas un accès direct cross-thread aux propriétés du contrôle dans Winform. Alors comment résoudre ce problème ? Voici plusieurs solutions.
Première solution : définissez Control.CheckForIllegalCrossThreadCalls sur false lorsque le fil de discussion est créé. Ce code indique au compilateur : Dans cette classe, nous ne vérifions pas si les appels cross-thread sont légaux (s'il n'y a pas d'exception lors de l'exécution sans ajouter cette phrase, cela signifie que le système adopte la méthode de non-vérification par défaut). Cependant, cette approche n'est pas recommandée. Si nous regardons la définition de la propriété CheckForIllegalCrossThreadCalls, nous constaterons qu'elle est statique, ce qui signifie que peu importe où nous modifions cette valeur dans le projet, elle prendra effet globalement. Et nous vérifions généralement s'il existe des exceptions dans un tel accès cross-thread. Si d'autres participants au projet modifient cet attribut, alors notre solution échouera et nous devrons adopter une autre solution.
Deuxième solution
namespace TestInvoker { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(StartSomeWorkFromUIThread)); thread.IsBackground = true; thread.Start(); //StartSomeWorkFromUIThread(); //label1.Text = "Set value through another thread!"; } private void StartSomeWorkFromUIThread() { if (this.InvokeRequired) { BeginInvoke(new EventHandler(RunsOnWorkerThread), null); } else { RunsOnWorkerThread(this, null); } } private void RunsOnWorkerThread(object sender, EventArgs e) { Thread.Sleep(2000); label1.Text = System.DateTime.Now.ToString(); } } }
Grâce au code ci-dessus, vous pouvez voir que le problème a a été résolu Résolu, en attendant l'asynchrone, nous n'aurons pas toujours le contrôle du thread principal, de sorte que le contrôle multithread du contrôle multithread winform puisse être complété sans exceptions d'appels cross-thread.
Ce qui précède est le contenu du développement multithread C# WinForm (1) Bibliothèque de classes Thread Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (m.sbmmt.com). )!