2010-11-22 12 views
4

Ich habe versucht, ein Objekt an meinen Haupt-Thread-Prozess zu übergeben, aber es scheint, dass es nicht so funktionieren wird, wie ich es dachte.Das Übergeben von Objekt an Thread schlägt fehl - C#

Zuerst habe ich den Thread erstellen:

Thread thrUDP; 

Dann schaffe ich das Objekt werde ich die Daten zu speichern, verwenden ich brauche:

UDPData udpData; 

Jetzt initialisieren ich das Objekt withthe korrekten Daten, Einstellungen und der neue Faden mit dem in die Start() -Methode übergeben Objekt starten:

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

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

Dies ist th e Verfahren möchte ich beginnen:

private void SendStatus(UDPData data) 
{ 
} 

erinnere ich mich Threads vor einiger Zeit mit, und ich bin sicher, dass sie nicht so schwer zu passieren Daten, bin ich auf diese Weise die falsch zu machen oder bin ich ein gerade fehlt Stück Code?

Danke!

Antwort

3

Der ParameterizedThreadStart Delegat wird erklärt, wie:

public delegate void ParameterizedThreadStart(object obj); 

ist klar, dieser Delegat mit Ihrer Methode Unterschrift nicht kompatibel ist, und es gibt keine direkte Möglichkeit, ein System.Threading.Thread zu arbeiten mit einer beliebigen delegate- zu erhalten Art.

Einer Ihrer Optionen wäre eine kompatible Signatur für das Verfahren zu verwenden, und wirft entsprechend:

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

Die andere Möglichkeit, das Problem zu dem C# -Compiler zu punten wäre, einen Verschluss zu schaffen. Zum Beispiel:

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

Sie beachten Sie, dass dies die ThreadStart Delegat verwendet stattdessen. Darüber hinaus sollten Sie vorsichtig sein, die udpData lokal zu ändern, da es erfasst wird.

Alternativ können Sie asynchrone Delegaten verwenden, wenn es Ihnen nichts ausmacht, den Threadpool zu verwenden, anstatt einen eigenen Thread zu erstellen. Zum Beispiel:

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

Ahh, so dass ich einfach den Parametertyp benötigt ändern und es dann in dem Verfahren auf den richtigen Typen werfen! Danke =] –

+1

@Jamie Keeling: Ja, das stimmt. Es ist ein bisschen ein Schmerz, ist es nicht .. – Ani

+0

Ich stimme nicht zu - normalerweise sollte die Klasse den neuen Thread in sich selbst erstellen - Erstellen von Threads von außen ist ein Rezept für Desaster von meinem POV, wenn Synchronisierung wird komplex. – weismat

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