lang:csharp:thread
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| lang:csharp:thread [2018/12/03 15:40] – Ajout de "Threads accédant aux composants d'une form" root | lang:csharp:thread [2020/05/11 00:51] (Version actuelle) – Fix alignement des images root | ||
|---|---|---|---|
| Ligne 3: | Ligne 3: | ||
| =====Blocage inter-threads===== | =====Blocage inter-threads===== | ||
| - | [[https:// | + | [[https:// |
| ====Sans aideur==== | ====Sans aideur==== | ||
| ===Sans valeur de retour=== | ===Sans valeur de retour=== | ||
| Ligne 78: | Ligne 78: | ||
| =====Création des threads===== | =====Création des threads===== | ||
| - | ====Thread | + | |
| + | ====Thread | ||
| + | <WRAP center round important 60%> | ||
| + | D'une manière générale, je déconseille l' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Donc pour que chaque Thread reste bien indépendant, | ||
| + | </ | ||
| + | |||
| + | <code csharp> | ||
| + | public static class Simulation | ||
| + | { | ||
| + | // Pas de risque de race condition, la valeur est modifiée | ||
| + | // par une seule ligne de code extérieure et n'est pas modifiée par Execution(). | ||
| + | public static long finSimul; | ||
| + | |||
| + | public static void Execution() | ||
| + | { | ||
| + | } | ||
| + | } | ||
| + | |||
| + | new Thread(new ThreadStart(Simulation.Execution)).Start(); | ||
| + | </ | ||
| + | |||
| + | ====Thread classique | ||
| [[https:// | [[https:// | ||
| <code csharp> | <code csharp> | ||
| Ligne 108: | Ligne 133: | ||
| =====Threads accédant aux composants d'une form===== | =====Threads accédant aux composants d'une form===== | ||
| Il faut arrêter les threads accédant aux composants d'une Form avant de la détruire. Sinon, des exceptions vont être générées. | Il faut arrêter les threads accédant aux composants d'une Form avant de la détruire. Sinon, des exceptions vont être générées. | ||
| + | |||
| + | La solution la plus simple est d' | ||
| + | |||
| + | Mais si on souhaite un arrêt non brutal des threads, on peut utiliser la classe ci-dessous. | ||
| + | |||
| + | On crée un '' | ||
| + | |||
| + | A la fermeture de la fenêtre, on appelle la méthode '' | ||
| <file csharp ManageThread.cs> | <file csharp ManageThread.cs> | ||
| Ligne 187: | Ligne 220: | ||
| // Travail à faire. | // Travail à faire. | ||
| }); | }); | ||
| - | | + | |
| - | | + | manageThread.Add(t); |
| - | { | + | |
| - | t.Start(); | + | |
| - | } | + | |
| | | ||
| private void Form1_FormClosed(object sender, FormClosedEventArgs e) | private void Form1_FormClosed(object sender, FormClosedEventArgs e) | ||
| Ligne 200: | Ligne 230: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | =====Threads lambda utilisant une variable locale===== | ||
| + | [[https:// | ||
| + | |||
| + | Mauvais : | ||
| + | <code csharp> | ||
| + | for (int i = 0; i < 2; i++) | ||
| + | { | ||
| + | Thread t = new Thread(() => | ||
| + | { | ||
| + | // i vaudra toujours 2 car le thread sera appelé après la boucle. | ||
| + | Console.WriteLine(i); | ||
| + | }); | ||
| + | t.Start(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Bon : | ||
| + | <code csharp> | ||
| + | for (int i = 0; i < 2; i++) | ||
| + | { | ||
| + | // Variable locale. | ||
| + | int j = i; | ||
| + | Thread t = new Thread(() => | ||
| + | { | ||
| + | Console.WriteLine(j); | ||
| + | }); | ||
| + | t.Start(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code csharp> | ||
| + | Parallel.For(0, | ||
| + | i => | ||
| + | { | ||
| + | Console.WriteLine(i); | ||
| + | } | ||
| + | ); | ||
| + | </ | ||
| + | Il est important de préciser le nombre maxi de threads sinon, si la charge baisse lors de l' | ||
lang/csharp/thread.1543848050.txt.gz · Dernière modification : de root
