Bonjour,
Comment peut on envoyer des parametres dans le thread ?
Est ce que quelqu'un peut m'aider ?
Merci.
Version imprimable
Bonjour,
Comment peut on envoyer des parametres dans le thread ?
Est ce que quelqu'un peut m'aider ?
Merci.
Bonjour,
le ThreadStart ne prend pas de paramètres, tu dois utiliser des variables globales.
ParametrizedThreadStart ne marche pas ?
effectivement ce délégué peut prendre des paramètres de type object, donc les paramètres de ta méthode doivent êtres en object.
Je dois passer deux variables par le Thread.
Comment peut on ecrire le syntaxe ?
Un thread lorsqu'il démarre peut au même titre qu'une tâche ponctuelle de pool, recevoir UN seul et unique Objet de type Object en guise de paramètre...
on l'appel state ou état, pour symboliser l'état de démarrage du thread.
Rien ne dit de quel type doit être cet objet, et tu peux très bien décider d'utiliser les types anonymes et générer l'objet à la volée.
Ce n'était pas envisageable avant dotnet 4.0 mais depuis dotnet 4.0 et le mot clé dynamic tu peux l'envisager.
si tu veux passer 2 éléments à ton thread tu peux très bien procéder comme ceci
c'est un exemple et il faudrait probablement rajouter quelques CAST mais ce n'est pas le problème... c'était plus un proof of concept qu'autre chose.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public start() { // ici tu défini Prm1 et Prm2 var thread = new Thread(process); thread.Start(new { prm1 = Prm1, prm2 = Prm2 }); } private void process(object state) { dynamic prms = state; int prm1 = prms.prm1; string prm2 = prms.prm2; // mon traitement }
de plus personnellement, je déconseilles cette technique, mais bon... chacun vois midi à sa porte.
En .Net tout hérite de Object, donc tu peux passer absolument n'importe quoi comme paramètre, mais juste un seul.
Si tu veux en passer plus, il te faut les regrouper, au sein d'un tableau, d'un tuple, d'une collection, d'une hashtable, d'un autre objet ou d'une autre structure, peut importe, c'est au choix selon les paramètres à passer.
L'important est de pouvoir le re-caster dans le bon type.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public static void main(string[] args) { System.Threading.Thread th = new System.Threading.Thread(MonThread); int Param1 = 12; string Param2 = "salut"; object[] ThreadParameter = new object[] { Param1, Param2 }; th.Start(ThreadParameter); } public void MonThread(Object param) { object[] p = (object[])param; int p0 = (int)p[0]; string p1 = (string)p[1]; // ... }
Utilise une classe privée, et passe la reférence de l'instance; ainsi, le seul cast c'est le cast initial de object vers ta classe paramètres :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 private class _MyParams { internal int _param1; internal string _param2; internal DateTime _param3; // etc, etc ... } private void start() { Thread thread = new System.Threading.Thread(new ParameterizedThreadStart(methodToStart)); _MyParams myParams = new _MyParams() { _param1 = 10, _param2 = "ABC3", _param3 = DateTime.Now // etc .... }; thread.Start(myParams); } private void methodToStart(object myObjectParam) { _MyParams myParams = (_MyParams)myObjectParam; int param1 = myParams._param1; string param2 = myParams._param2; DateTime param3 = myParams._param3; // mon traitement }