2009-05-01 28 views
28

Das Verfahren unten ist, was ich in diesem Thread getan werden soll:Wie erstelle ich einen Thread?

public void Startup(int port,string path) 
{ 
    Run(path); 
    CRCCheck2(); 
    CRCCheck1(); 
    InitializeCodeCave((ushort)port); 
} 

Ich habe versucht, was ich googeln finden konnte, aber nichts funktionierte

public void Test(int port,string path) 
{ 
    Thread t = new Thread(Startup(port,path)); 
} 

public void TestA(int port,string path) 
{ 
    Thread t = new Thread(Startup); 
    t.Start (port,path); 
} 

Beide kompilieren nicht, wie zu tun Das?

+1

funktioniert nicht oder kompiliert nicht? – Aziz

+0

Sie sollten die verwendete Sprache angeben, damit ich (wir) nicht raten müssen. Auch zu sagen, was nicht funktioniert, wäre großartig. – tuergeist

+1

Überprüfen Sie die Frage-Tags - C# Es kompiliert nicht. –

Antwort

51

Die folgenden Möglichkeiten funktionieren.

// The old way of using ParameterizedThreadStart. This requires a 
// method which takes ONE object as the parameter so you need to 
// encapsulate the parameters inside one object. 
Thread t = new Thread(new ParameterizedThreadStart(StartupA)); 
t.Start(new MyThreadParams(path, port)); 

// You can also use an anonymous delegate to do this. 
Thread t2 = new Thread(delegate() 
{ 
    StartupB(port, path); 
}); 
t2.Start(); 

// Or lambda expressions if you are using C# 3.0 
Thread t3 = new Thread(() => StartupB(port, path)); 
t3.Start(); 

Die Startmethoden haben folgende Signatur für diese Beispiele.

public void StartupA(object parameters); 

public void StartupB(int port, string path); 
+1

Ich bekomme den Fehler, wenn ich den "alten Weg" benutze, aber der Lamba-Ausdruck funktioniert perfekt. :) –

+1

Die erforderlichen Startmethoden-Signaturen wurden verdeutlicht. –

+0

Schön - Ich habe gerade eine Antwort unter Verwendung der "alten" Art geschrieben, aber nicht realisiert, dass Sie Lambda-Ausdrücke verwenden können, um einen saubereren Thread-Einstiegspunkt zu erstellen. –

7

Die Methode, die Sie ausführen möchten, muss eine ThreadStart Delegate sein. Bitte konsultieren Sie die Thread documentation auf MSDN. Beachten Sie, dass Sie Ihren Zwei-Parameter-Start mit einem Abschluss sortieren können. Etwas wie:

var t = new Thread(() => Startup(port, path)); 

Beachten Sie, dass Sie möglicherweise Ihre Methode Zugänglichkeit erneut besuchen möchten. Wenn ich eine Klasse sehen würde, die auf diese Weise einen Thread mit einer eigenen öffentlichen Methode startet, wäre ich etwas überrascht.

+0

Ich habe das versucht, es funktioniert nicht. ThreadStart t = neuer ThreadStart (Startup); << Keine Überladung für "Startup" stimmt mit Delegate überein "System.Threading.ThreadStart –

+0

Der Startvorgang dauert zwei Parameter. Wenn Sie die Dokumente überprüfen, die ich verlinkt habe, übernimmt ThreadStart keine Parameter. Wir können mit einer Schließung schummeln, um sie wie zwei (in 3.5) aussehen zu lassen, oder wir können ParameterizedThreadStart verwenden und die zwei Parameter in ein Objekt (vor 3.5) bündeln. –

2
public class ThreadParameter 
     { 
      public int Port { get; set; } 
      public string Path { get; set; } 
     } 


Thread t = new Thread(new ParameterizedThreadStart(Startup)); 
t.Start(new ThreadParameter() { Port = port, Path = path}); 

ein Objekt mit den Port und Pfadobjekten erstellen und an die Startup-Methode übergeben.

+0

Nur wenn ich Ihre erste Zeile schreibe, bekomme ich "Keine Überladung für" Startup "passt Delegate 'System.Threading.ParameterizedThreadStart" –

+0

Der Start muss "void Startup (Objektparameter)" sein. Sie können "void Startup (ThreadParameter parameter)" nicht verwenden, da Sie kein Objekt an dieses übergeben können. Sie können die Objektparameter innerhalb von Startup auf ThreadParameter anwenden. –

+0

Sie müssen die Signiture der Startup-Methode ändern, um die ThreadParameter-Klasse zu akzeptieren ..... (die Klasse, die Sie mit den 2 Parametern erstellt haben). – CSharpAtl

2

Ihr Beispiel schlägt fehl, weil Thread-Methoden Argumente entweder eins oder null annehmen. Um einen Thread ohne Durch Argumente zu schaffen, sieht der Code wie folgt:

void Start() 
{ 
    // do stuff 
} 

void Test() 
{ 
    new Thread(new ThreadStart(Start)).Start(); 
} 

Wenn Sie Daten übergeben wollen an den Thread, müssen Sie Ihre Daten in ein einzelnes Objekt kapseln, ob das eine benutzerdefinierte Klasse Ihrer eigenes Design oder ein Wörterbuchobjekt oder etwas anderes. Sie müssen dann die ParameterizedThreadStart Delegierten verwenden, etwa so:

void Start(object data) 
{ 
    MyClass myData = (MyClass)myData; 
    // do stuff 
} 

void Test(MyClass data) 
{ 
    new Thread(new ParameterizedThreadStart(Start)).Start(data); 
} 
7

ich die Task-Fabrik von System.Threading.Tasks mag. Sie können etwas tun:

Task.Factory.StartNew(() => 
{ 
    // Whatever code you want in your thread 
}); 

Beachten Sie, dass die Aufgabe Fabrik Sie zusätzliche Komfort-Optionen wie ContinueWith gibt:

Task.Factory.StartNew(() => {}).ContinueWith((result) => 
{ 
    // Whatever code should be executed after the newly started thread. 
}); 

Beachten Sie auch, dass eine Aufgabe ein etwas anderes Konzept als Gewinde ist. Sie passen gut zu den async/await-Schlüsselwörtern, siehe here.

Verwandte Themen