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:49] – Ajout de "Threads lambda utilisant une variable locale" 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 202: | Ligne 232: | ||
| =====Threads lambda utilisant une variable locale===== | =====Threads lambda utilisant une variable locale===== | ||
| - | [[https:// | + | [[https:// |
| Mauvais : | Mauvais : | ||
| Ligne 231: | Ligne 261: | ||
| </ | </ | ||
| - | Autre possibilité (non totalement identique en cas de nombreux threads en parallèle) : utilisation de Parallel.For. | ||
| <code csharp> | <code csharp> | ||
| - | Parallel.For(0, | + | Parallel.For(0, |
| i => | i => | ||
| { | { | ||
| Ligne 240: | Ligne 269: | ||
| ); | ); | ||
| </ | </ | ||
| + | Il est important de préciser le nombre maxi de threads sinon, si la charge baisse lors de l' | ||
lang/csharp/thread.1543848595.txt.gz · Dernière modification : de root
