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 : 2018/12/03 15:49 de root