Il y a une surcharge qui accepte un état d'objet - cependant, OMI la meilleure façon de transmettre des arguments arbitraires à un ThreadStart (et vérifier la signature au moment de la compilation) est une méthode anonyme:
int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
Just (ce qui est importante) - * ne changent pas a
ou b
après cela, comme le changement se refléter sur le fil (comme une course) - à savoir ne pas faire: d'introduire des variables supplémentaires pour ce
int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
a = 12; // this change will be visible to the anonymous method - be careful ;-p
Dans le cas des boucles, il est important (quand sur des variables et capturées async); ceux-ci sont très différentes
int[] data = {1,2,3,4,5};
foreach(int i in data) {
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(i); });
}
Console.ReadLine();
(qui sera probablement imprimer 5,5,5,5,5)
int[] data = {1,2,3,4,5};
foreach (int i in data) {
int tmp = i;
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(tmp); });
}
Console.ReadLine();
(qui imprimera 1-5 sans ordre particulier)
Mise à jour pour discuter du point de Meeh (commentaires); qu'est-ce que cette impression (99,999% du temps - il y a une condition de concurrence)?
string s = "dreams";
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(s);
});
s = "reality";
Console.ReadLine();
S'il vous plaît être plus descriptif dans votre question –
Vous voulez faire le paramètre délégué cteur ThreadStart() de type void MyFunc (void)? – cwap
Cochez ici: [http://www.yoda.arachsys.com/csharp/threads/parameters.shtml](http://www.yoda.arachsys.com/csharp/threads/parameters.shtml) Ou ici, en utilisant le pool de threads: [http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml](http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml) –