Fils et délégués - Je ne comprends pas complètement leurs relations
J'ai écrit un code qui ressemble à ceci:
Thread t = new Thread(() => createSomething(dt, start, finish) );
t.Start();
et il fonctionne (parfois on a presque l'impression qu'il y a plusieurs threads)
pourtant je ne l'utilise pas tous les délégués.
- Quel est le sens de la bande de roulement, sans un délégué
- Si un délégué est nécessaire - alors s'il vous plaît dites-moi ce que et comment la connexion est établie avec le délégué.
source d'informationauteur Asaf
Vous devez vous connecter pour publier un commentaire.
Multi-threading est très complexe. Vous êtes à couper et coller le code sans même apprendre quoi que ce soit sur les aspects les plus fondamentaux de filetage - comment faire pour démarrer un thread. Coller quelque chose sur le web dans une INTERFACE utilisateur pour fixer ou modifier un contrôle, c'est une chose. C'est un genre complètement différent de processus. Vous avez besoin d'étudier le sujet, écrire votre propre code, et de comprendre exactement comment il fonctionne, sinon vous êtes juste de gaspiller votre temps avec cela.
Un délégué est l' .NET version sécurisée de type pointeur de fonction. Tous les threads besoin d'un point d'entrée pour lancer l'exécution. Par définition, lorsqu'un thread principal est créée, elle s'exécute toujours Main() comme point d'entrée. Tout les threads supplémentaires vous créez aurez besoin d'un définies explicitement point d'entrée - un pointeur vers la fonction de l'endroit où ils devraient commencer l'exécution. Donc threads toujours besoin d'un délégué.
Délégués sont souvent utilisés dans les enfiler pour d'autres fins, trop, surtout pour les rappels. Si vous voulez un thread pour signaler certaines informations telles que l'état d'achèvement, une possibilité est de créer une fonction de rappel qui le thread peut utiliser. À nouveau le fil a besoin d'un pointeur pour être en mesure d'exécuter le rappel de sorte que les délégués sont utilisés pour cela. Contrairement à un point d'entrée de ces options sont facultatives, mais le concept est le même.
La relation entre les threads les délégués et les threads secondaires ne peut pas simplement appeler des méthodes comme la principale application thread, donc un pointeur de fonction est nécessaire, au lieu de délégués et d'agir comme des pointeurs de fonction.
Vous ne voyez pas le délégué et que vous n'avez pas à en créer un, parce que le cadre est fait pour vous, dans le Fil de constructeur. Vous pouvez passer dans la méthode que vous souhaitez utiliser pour démarrer le thread, et le code de la structure crée un délégué qui pointe vers cette méthode pour vous. Si vous souhaitez utiliser un callback, vous devez créer un délégué de vous-même.
Voici le code sans les expressions lambda. SomeClass a quelques de transformation qui prend du temps et est fait sur les threads d'arrière-plan. Pour aider à cela la SomeThreadTask a été créé, et il contient le code processus et tout le thread doit l'exécuter. Un second délégué est utilisé pour un rappel lorsque le thread est terminé.
Code réel serait plus compliqué, et d'une véritable classe ne devriez jamais avoir à savoir comment créer des threads, etc donc, vous auriez du gestionnaire d'objets.
Vous sont à l'aide d'un délégué - c'est juste C# sucre syntaxique pour:
Le compilateur est déduire de l'expression lambda et les différentes surcharges que le
Thread
constructeur, que votre intention est de:ThreadStart
délégué.Thread
qui accepte unThreadStart
objet.Vous pourriez aussi équivalente à écrire ce avec anonyme-délégué de la syntaxe:
Si les arguments de
createSomething
ne le sont pas (capturé) les habitants, vous pourriez écrire cela sans méthodes anonymes au total, qui doit mettre en évidence la création de l'délégué à présent plus clairement: