2010-11-22 23 views
4

J'ai essayé de passer un objet à mon processus thread principal, mais il semble que cela ne fonctionnera pas comme je le pensais.La transmission d'un objet à un thread échoue - C#

D'abord, je crée le fil:

Thread thrUDP; 

Puis-je créer l'objet que je vais utiliser pour stocker les données dont j'ai besoin:

UDPData udpData; 

Maintenant, j'Initialise l'objet withthe données correctes, Configurer le nouveau fil et commencer avec l'objet passé dans la méthode start():

udpData = new UDPData("224.5.6.7", "5000", "0", "2"); 

      thrUDP = new Thread(new ParameterizedThreadStart(SendStatus)); 
      thrUDP.Start(udpData); 

C'est e méthode e Je voudrais commencer:

private void SendStatus(UDPData data) 
{ 
} 

Je me souviens en utilisant Threads un certain temps et je suis sûr qu'ils ne sont pas si difficiles à transmettre des données à, je fais cela dans le mauvais sens ou suis-je manque juste un morceau de code?

Merci!

Répondre

3

Le délégué ParameterizedThreadStart est déclaré:

public delegate void ParameterizedThreadStart(object obj); 

De toute évidence, ce délégué est pas compatible avec la signature de votre méthode, et il n'y a pas un moyen direct pour obtenir un System.Threading.Thread de travailler avec un delegate- arbitraire type.

L'une des options serait d'utiliser une signature compatible pour la méthode, et jeter selon le cas:

private void SendStatus(object obj) 
{ 
    UDPData data = (UDPData)obj; 
    ... 
} 

L'autre option serait de punt le problème au compilateur C#, la création d'une fermeture. Par exemple:

new Thread(() => SendStatus(udpData)).Start(); 

Notez que cette façon utilise le lieu délégué ThreadStart. En outre, vous devez être prudent avec la modification ultérieure du udpData local, car il est capturé. Alternativement, si cela ne vous dérange pas d'utiliser le pool de threads au lieu de générer votre propre thread, vous pouvez utiliser des délégués asynchrones. Par exemple:

Action<UDPData> action = SendStatus; 
action.BeginInvoke(udpData, action.EndInvoke, null); 
+0

Ahh, donc je tout simplement besoin de changer le type de paramètre, puis jeter le type correct dans la méthode! Merci =] –

+1

@Jamie Keeling: Oui, c'est vrai. C'est un peu pénible, n'est-ce pas .. – Ani

+0

Je ne suis pas d'accord - en général la classe devrait créer le nouveau fil à l'intérieur - créer des fils de l'extérieur est une recette pour désaster de mon pov si la synchronisation devient complexe. – weismat

1
private void SendStatus(object data) 
{ 
UDPData myData = (UDPData) data; 
}