Comment passer plus d'un paramètre à un thread C#? Tout exemple sera apprécié.Comment passer plus d'un paramètre à un thread C#?
Répondre
Supposons que vous ayez une méthode:
void A(string a, int b) {}
Cela devrait fonctionner (.NET 2.0):
ThreadStart starter = delegate { A("word", 10); };
Thread thread = new Thread(starter);
thread.Start();
Et les éléments suivants (plus court) pour les versions supérieures:
ThreadStart starter =() => A("word", 10);
Thread thread = new Thread(starter);
//or just...
//Thread thread = new Thread(() => A("word",10));
thread.start()
Les solutions tsocks a donné pourrait ne pas être bon pour tout situat ions car il spécifie les paramètres au moment de la création du délégué ThreadStart, au lieu de au moment de l'exécution. Cela pourrait conduire à des erreurs car les paramètres peuvent changer avant l'exécution ce qui n'est probablement pas ce que vous voulez. Supposons que vous devez créer plusieurs threads dans une boucle, chacun avec ses propres paramètres:
void CreateAndRunThreads()
{
List<ThreadStart> threadStartsList = new List<ThreadStart>();
//delegate creation
for (int i = 0; i < 5; i++)
{
ThreadStart ts = delegate() { PrintInteger(i); };
threadStartsList.Add(ts);
}
//delegate execution (at this moment i=5 in the previous loop)
foreach(ThreadStart ts in threadStartsList)
{
Thread t = new Thread(ts);
t.Start();
}
}
private void PrintInteger(int i)
{
Debug.WriteLine("The integer value: "+i);
}
La sortie est ici comme suit:
The integer value: 5
The thread 0x17f0 has exited with code 0 (0x0).
The integer value: 5
The integer value: 5
The thread 0x10f4 has exited with code 0 (0x0).
The integer value: 5
The thread 0x1488 has exited with code 0 (0x0).
The integer value: 5
The thread 0x684 has exited with code 0 (0x0).
Notez que tous les délégués imprimés la valeur 5, non 0 à 4. En effet, les délégués ThreadStart utilisent la variable "i", telle qu'elle est au moment de l'exécution, et non au moment de la création du délégué. Donc tout changement (i ++ dans la boucle) au paramètre après le moment de la création du délégué sera reflété dans la valeur du paramètre lorsque le délégué s'exécute.
Une solution à ce problème consiste à utiliser ParameterThreadStart et une classe personnalisée qui agrège tous vos paramètres (s'il y en a plus). Avec parameterizedThreadStart, vous passez les paramètres au moment de l'exécution. Cela ressemblerait à quelque chose comme ceci:
class CustomParameters
{
public int IntValue { get; set; }
public string FriendlyMessage { get; set; }
}
private void CreateAndRunThreadsWithParams()
{
List<ParameterizedThreadStart> threadStartsList = new List<ParameterizedThreadStart>();
//delegate creation
for (int i = 0; i < 5; i++)
{
ParameterizedThreadStart ts = delegate(object o) { PrintCustomParams((CustomParameters)o); };
threadStartsList.Add(ts);
}
//delegate execution
for (int i=0;i<threadStartsList.Count;i++)
{
Thread t = new Thread(threadStartsList[i]);
t.Start(new CustomParameters() { IntValue = i, FriendlyMessage = "Hello friend! Your integer value is:{0}"});
}
}
private void PrintCustomParams(CustomParameters customParameters)
{
Debug.WriteLine(string.Format(customParameters.FriendlyMessage, customParameters.IntValue));
}
La sortie est montrée ici:
Hello friend! Your integer value is:1
The thread 0x1510 has exited with code 0 (0x0).
Hello friend! Your integer value is:0
The thread 0x13f4 has exited with code 0 (0x0).
Hello friend! Your integer value is:2
The thread 0x157c has exited with code 0 (0x0).
Hello friend! Your integer value is:3
The thread 0x14e4 has exited with code 0 (0x0).
Hello friend! Your integer value is:4
The thread 0x1738 has exited with code 0 (0x0).
(L'ordre d'exécution n'est pas déterministe, il est une course entre les fils)
pour C# 3.0 vous pouvez éviter le tableau d'objets laide en passant par des méthodes anonymes:
void Run()
{
string param1 = "hello";
int param2 = 42;
Thread thread = new Thread(delegate()
{
MyMethod(param1,param2);
});
thread.Start();
}
void MyMethod(string p,int i)
{
}
l'un des moyens les plus simples t o paramètre passe à fil selon
Thread xmlThread =new Thread(()=>WriteLog(LogTypes.Message, "Flag", "Module", "Location", "Text", "Stacktrace"));
xmlThread.Start();
private object WriteLog(LogTypes logTypes, string p, string p_2, string p_3, string p_4, string p_5)
{
}
public void Start()
{
var t1 = new Thread((message) => { Console.WriteLine(message); });
//the parametirized threadstart accepts objects, it is not generic
var t2 = new Thread(number => { var num = (int)number;
Console.WriteLine(num++);
});
var t3 = new Thread((vals)=> work(vals));
t1.Start();
t2.Start();
t3.Start(20);
}
public void work(params object[] vals)
{
}
- 1. Passer un paramètre à System.EventHandler dans C#
- 2. C# - Comment passer un type en paramètre
- 3. Passer un msg à un autre thread dans C#
- 4. Comment passer un paramètre d'ASP à XSL?
- 5. Comment passer plus d'un paramètre à View from Controller
- 6. Comment passer un signe plus dans le paramètre d'entrée?
- 7. Comment passer un paramètre à une servlet
- 8. Iphone - comment passer un paramètre à animationDidStop?
- 9. Comment passer un paramètre à cette jquery?
- 10. Passer un paramètre à un service Windows dans C#
- 11. Comment passer un événement en paramètre en C#
- 12. JSF- passer un paramètre à valuechangelistener
- 13. Comment passer des paramètres à un objet Thread?
- 14. Comment passer un paramètre de C# à FORTRAN avec le paramètre de type CHARACTER * 50?
- 15. Démarrage d'un thread avec un paramètre
- 16. Comment passer des paramètres à un thread dans c multithread correctement
- 17. Unity Application Block, Comment passer un paramètre à Injection Factory?
- 18. Comment passer un paramètre à SQlDataSource à partir de gridview?
- 19. Comment passer un paramètre à une fonction javascript en ligne
- 20. C# Comment invoquer avec plus d'un paramètre
- 21. Comment passer le paramètre QueryString à PageMethods?
- 22. Ruby win32ole - comment passer un paramètre VARIANT?
- 23. Comment passer une exception d'un thread à un autre thread (appelant) dans Delphi?
- 24. comment puis-je passer un paramètre d'ASP.NET à SSRS Report?
- 25. Comment passer un paramètre de receiveActivity à une autre activité?
- 26. Comment passer un paramètre à l'opérateur IN dans NHibernate?
- 27. Comment passer un paramètre de html à jQuery
- 28. Comment passer un paramètre à une fonction Javascript définie dynamiquement?
- 29. Comment passer une variable à un paramètre d'impression awk
- 30. Comment passer un paramètre à une fonction de Assembly à C
'nouveau fil (() => A ("mot", 10))' pour 3 + C#. – Dykam
Exactement. Je pensais à .NET 2.0. –
@Dykam, pouvez-vous élaborer la signification de "() =>" dans l'exemple donné par vous (new Thread (() => A ("word", 10))) – Techee