Wie übergebe ich Parameter an die Thread.ThreadStart()
Methode in C #?
Angenommen, ich habe eine Methode namens "Download".
public void download(string filename)
{
// download code
}
Jetzt habe ich einen Thread in der Hauptmethode erstellt:
Thread thread = new Thread(new ThreadStart(download(filename));
Fehlermethode Typ erwartet.
Wie kann ich Parameter ThreadStart
mit der Zielmethode mit Parametern übergeben?
c#
.net
multithreading
Swapnil Gupta
quelle
quelle
Antworten:
Das einfachste ist einfach
Der Vorteil (der Vorteile) dieses (Over
ParameterizedThreadStart
) besteht darin, dass Sie mehrere Parameter übergeben können und eine Überprüfung der Kompilierungszeit erhalten, ohneobject
ständig umwandeln zu müssen .quelle
new Thread(delegate() { download(filename); });
Schauen Sie sich dieses Beispiel an:
Sie erstellen zuerst einen Thread, indem Sie den Delegaten an die Worker-Methode übergeben und ihn dann mit einer Thread.Start-Methode starten, die Ihr Objekt als Parameter verwendet.
In Ihrem Fall sollten Sie es also folgendermaßen verwenden:
Ihre 'Download'-Methode muss jedoch weiterhin ein Objekt und keine Zeichenfolge als Parameter verwenden. Sie können es in einen String in Ihrem Methodenkörper umwandeln.
quelle
Sie möchten den
ParameterizedThreadStart
Delegaten für Thread-Methoden verwenden, die Parameter annehmen. (Oder gar keine, und lassen Sie denThread
Konstruktor schließen.)Anwendungsbeispiel:
quelle
Das könnte dir auch
delegate
gefallen ...quelle
In Zusätzlich
quelle
Sie können die Thread-Funktion (Download) und die erforderlichen Parameter (Dateiname) in einer Klasse kapseln und den ThreadStart-Delegaten verwenden, um die Thread-Funktion auszuführen.
quelle
Ich würde Ihnen empfehlen, eine andere Klasse namens File zu haben.
Und in Ihrem Thread-Erstellungscode instanziieren Sie eine neue Datei:
quelle
Wie wäre es damit: (oder ist es in Ordnung, so zu verwenden?)
quelle
Nach Ihrer Frage ...
... und den Fehler, auf den Sie gestoßen sind, müssten Sie Ihren Code von korrigieren
zu
Die Frage ist jedoch komplexer, wie es zunächst scheint.
Die
Thread
Klasse (4.7.2) bietet derzeit mehrere Konstruktoren und eineStart
Methode mit Überladungen.Diese relevanten Konstruktoren für diese Frage sind:
und
die entweder einen
ThreadStart
Delegierten oder einenParameterizedThreadStart
Delegierten nehmen.Die entsprechenden Delegierten sehen folgendermaßen aus:
Wie zu sehen ist, scheint der richtige Konstruktor derjenige zu sein, der einen
ParameterizedThreadStart
Delegaten nimmt, so dass eine Methode, die der angegebenen Signatur des Delegaten entspricht, vom Thread gestartet werden kann.Ein einfaches Beispiel für die Instanziierung der
Thread
Klasse wäreoder nur
Die Signatur der entsprechenden Methode (
Work
in diesem Beispiel aufgerufen ) sieht folgendermaßen aus:Was bleibt, ist den Thread zu starten. Dies erfolgt entweder mit
oder
Während
Start()
der Thread gestartet undnull
als Daten an die Methode übergeben würde,Start(...)
kann verwendet werden, um alles an dieWork
Methode des Threads zu übergeben.Bei diesem Ansatz gibt es jedoch ein großes Problem: Alles, was an die
Work
Methode übergeben wird, wird in ein Objekt umgewandelt. Das heißt, innerhalb derWork
Methode muss es wieder wie im folgenden Beispiel in den ursprünglichen Typ umgewandelt werden:Casting ist etwas, was Sie normalerweise nicht wollen.
Was ist, wenn jemand etwas anderes übergibt, das keine Zeichenfolge ist? Da dies zunächst nicht möglich zu sein scheint (weil es meine Methode ist, ich weiß, was ich tue oder die Methode privat ist, wie sollte jemand jemals etwas an sie weitergeben können? ), Können Sie möglicherweise aus verschiedenen Gründen genau diesen Fall haben . Da einige Fälle möglicherweise kein Problem darstellen, sind es andere. In solchen Fällen werden Sie wahrscheinlich mit einem enden
InvalidCastException
die Sie wahrscheinlich nicht bemerken werden, weil sie den Thread einfach beendet.Als Lösung würden erwarten , dass Sie ein generisch erhalten
ParameterizedThreadStart
Delegierten wie ,ParameterizedThreadStart<T>
woT
die Daten der Typ , der Sie in denen geben wollen wäreWork
Methode. Leider gibt es so etwas (noch?) Nicht.Es gibt jedoch eine vorgeschlagene Lösung für dieses Problem. Dabei wird eine Klasse erstellt, die sowohl die an den Thread zu übergebenden Daten als auch die Methode enthält, die die Arbeitsmethode wie folgt darstellt:
Mit diesem Ansatz würden Sie den Thread folgendermaßen starten:
Auf diese Weise vermeiden Sie einfach das Herumwirbeln und haben eine typsichere Möglichkeit, Daten für einen Thread bereitzustellen ;-)
quelle
Hier ist der perfekte Weg ...
quelle