2010-01-18 3 views
4

Disons que j'ai une fonctionUn délégué peut-il transporter des paramètres?

public void SendMessage(Message message) 
{ 
    // perform send message action 
} 

Puis-je créer un délégué pour ce genre de fonction? Si oui, comment puis-je transmettre un message lorsque j'utilise le délégué?

Dans mon cas, la fonction est utilisée par Thread. Chaque fois qu'il y a un événement, j'ai besoin d'envoyer un message au serveur, pour garder l'enregistrement. J'ai également besoin de le faire fonctionner en arrière-plan, de sorte que cela n'affecte pas l'application. Toutefois, le thread doit utiliser le délégué

Thread t = new Thread(new ThreadStart(SendMessage)); 

et je ne sais pas comment transmettre le message au délégué. Merci.

+0

Ils peuvent avoir une valeur de retour aussi bien. Utile pour les fonctions de prédicat et de tri. – Skurmedel

Répondre

2

Vous devez utiliser un ParametizedThreadStart. Voir ici:

http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

+0

C'est un délégué spécialisé utilisé par l'infrastructure de threads. L'utiliser en dehors de ce contexte n'a pas beaucoup de sens. Il est préférable de créer son propre délégué, ou comme Mehrdad l'a dit plus haut, utilisez l'action . –

+0

Regardez à nouveau sa question. Il dit spécifiquement que cette question est en référence à la transmission d'un paramètre à un Thread en arrière-plan: -P – TJMonk15

+0

Ah oui, vous avez raison. Désolé pour ça, il est trop tard pour reprendre ma downvote. Vous avez la meilleure réponse de tous ici. –

11

Bien sûr

public delegate void DelWithSingleParameter(Message m); 

Passer un message peut être fait avec les éléments suivants

DelWithSingleParameter d1 = new DelWithSingleParameter(this.SomeMethod); 
d1(new Message()); 

également comme @Mehrdad souligné dans les versions plus récentes du cadre que vous ne avez plus besoin de définir ces délégués. Au lieu de cela, réutilisez le délégué Action<T> existant pour ce type d'opération.

Action<Message> d1 = new Action<Message>(this.SomeMethod); 
d1(new Message()); 
+7

ou simplement 'Action ';) –

+1

1+. Dans les nouvelles versions du langage, vous pouvez également omettre la "nouvelle Action <>", comme vous le savez sûrement;) – Skurmedel

+0

@Skurmedel ou je pourrais aller dans l'autre sens et utiliser 'var' au lieu d'un type de variable explicite;) – JaredPar

3

sûr, il suffit de définir le délégué de cette façon:

delegate void SendMessageDelegate(Message message); 

Ensuite, il suffit invoquez comme d'habitude:

public void InvokeDelegate(SendMessageDelegate del) 
{ 
     del(new Message()); 
} 
0

Vous pouvez aussi faire des choses comme ça

object whatYouNeedToPass = new object(); 

Thread t = new Thread(() => 
{ 
    // whatYouNeedToPass is still here, you can do what ever you want :) 
}); 

t.Start(); 
Questions connexes