Comment passer des paramètres à Thread.ThreadStart()
méthode en C #?
Supposons que j'ai une méthode appelée «téléchargement»
public void download(string filename)
{
// download code
}
Maintenant, j'ai créé un fil dans la méthode principale:
Thread thread = new Thread(new ThreadStart(download(filename));
type de méthode d'erreur attendu.
Comment puis-je transmettre des paramètres ThreadStart
avec la méthode cible avec des paramètres?
c#
.net
multithreading
Swapnil Gupta
la source
la source
Réponses:
Le plus simple est juste
Le (s) avantage (s) de ce (sur
ParameterizedThreadStart
) est que vous pouvez passer plusieurs paramètres, et vous obtenez une vérification au moment de la compilation sans avoir besoin de transtyper àobject
tout moment.la source
new Thread(delegate() { download(filename); });
Regardez cet exemple:
Vous créez d'abord un thread en passant délégué à la méthode de travail, puis le démarre avec une méthode Thread.Start qui prend votre objet en paramètre.
Donc, dans votre cas, vous devez l'utiliser comme ceci:
Mais votre méthode de téléchargement doit toujours prendre un objet , pas une chaîne comme paramètre. Vous pouvez le convertir en chaîne dans votre corps de méthode.
la source
Vous souhaitez utiliser le
ParameterizedThreadStart
délégué pour les méthodes de threads qui prennent des paramètres. (Ou pas du tout en fait, et laissez leThread
constructeur en déduire.)Exemple d'utilisation:
la source
Vous pourriez aussi
delegate
aimer ainsi ...la source
De plus
la source
Vous pouvez encapsuler la fonction de thread (téléchargement) et les paramètres nécessaires (nom de fichier) dans une classe et utiliser le délégué ThreadStart pour exécuter la fonction de thread.
la source
Je vous recommanderais d'avoir une autre classe appelée File.
Et dans votre code de création de threads, vous instanciez un nouveau fichier:
la source
Que diriez-vous de ceci: (ou est-ce correct d'utiliser comme ça?)
la source
Selon votre question ...
... et l'erreur que vous avez rencontrée, vous devrez corriger votre code à partir de
à
Cependant, la question est plus complexe qu'elle semble au premier abord.
La
Thread
classe actuellement (4.7.2) fournit plusieurs constructeurs et uneStart
méthode avec des surcharges.Ces constructeurs pertinents pour cette question sont:
et
qui soit prendre un
ThreadStart
délégué ou unParameterizedThreadStart
délégué.Les délégués correspondants ressemblent à ceci:
Ainsi, comme on peut le voir, le constructeur correct à utiliser semble être celui qui prend un
ParameterizedThreadStart
délégué afin qu'une certaine méthode conforme à la signature spécifiée du délégué puisse être démarrée par le thread.Un exemple simple d'instanciation de la
Thread
classe seraitou juste
La signature de la méthode correspondante (appelée
Work
dans cet exemple) ressemble à ceci:Ce qui reste est de démarrer le fil. Cela se fait en utilisant soit
ou
Alors
Start()
que démarrerait le thread et passeraitnull
comme données à la méthode,Start(...)
peut être utilisé pour passer n'importe quoi dans leWork
méthode du thread.Il y a cependant un gros problème avec cette approche: tout ce qui est passé dans la
Work
méthode est converti en objet. Cela signifie que dans laWork
méthode, il doit à nouveau être converti en type d'origine, comme dans l'exemple suivant:Le casting est quelque chose que vous ne voulez généralement pas faire.
Et si quelqu'un passe quelque chose d'autre qui n'est pas une chaîne? Comme cela ne semble pas possible au premier abord (parce que c'est ma méthode, je sais ce que je fais ou la méthode est privée, comment quelqu'un devrait-il pouvoir lui transmettre quoi que ce soit? ), Vous pouvez éventuellement vous retrouver exactement avec ce cas pour diverses raisons . Comme certains cas peuvent ne pas être un problème, d'autres le sont. Dans de tels cas, vous vous retrouverez probablement avec un
InvalidCastException
que vous ne remarquerez probablement pas car il termine simplement le thread.Comme solution, vous vous attendez à obtenir un
ParameterizedThreadStart
délégué générique commeParameterizedThreadStart<T>
oùT
serait le type de données que vous souhaitez transmettre dans leWork
méthode. Malheureusement, quelque chose comme ça n'existe pas (encore?).Il existe cependant une solution suggérée à ce problème. Cela implique de créer une classe qui contient les deux, les données à transmettre au thread ainsi que la méthode qui représente la méthode de travail comme ceci:
Avec cette approche, vous commenceriez le fil comme ceci:
Donc, de cette façon, vous évitez simplement de lancer et d'avoir un moyen sûr de fournir des données à un thread ;-)
la source
voici le moyen parfait ...
la source