Wie mehrere Parameter an einen C# -Thread übergeben werden? Jedes Beispiel wird geschätzt.Wie übergeben Sie mehr als einen Parameter an einen C# -Thread?
Antwort
Angenommen, Sie haben eine Methode:
void A(string a, int b) {}
Dies sollte (.NET 2.0) arbeiten:
ThreadStart starter = delegate { A("word", 10); };
Thread thread = new Thread(starter);
thread.Start();
und die folgenden (kürzere) für höhere Versionen:
ThreadStart starter =() => A("word", 10);
Thread thread = new Thread(starter);
//or just...
//Thread thread = new Thread(() => A("word",10));
thread.start()
Die Lösungen tsocks hat gegeben, möglicherweise nicht gut für alle situat Ionen, weil es die Parameter zum Zeitpunkt der Erstellung des ThreadStart-Delegaten angibt, statt zum Zeitpunkt der Ausführung. Dies könnte zu Fehlern führen, da sich die Parameter vor der Ausführung ändern könnten, was wahrscheinlich nicht das ist, was Sie wollen. Angenommen, Sie müssen mehrere Threads in einer Schleife erstellen, die jeweils mit einer eigenen Parameter:
void CreateAndRunThreads()
{
List<ThreadStart> threadStartsList = new List<ThreadStart>();
//delegate creation
for (int i = 0; i < 5; i++)
{
ThreadStart ts = delegate() { PrintInteger(i); };
threadStartsList.Add(ts);
}
//delegate execution (at this moment i=5 in the previous loop)
foreach(ThreadStart ts in threadStartsList)
{
Thread t = new Thread(ts);
t.Start();
}
}
private void PrintInteger(int i)
{
Debug.WriteLine("The integer value: "+i);
}
Der Ausgang ist hier wie folgt:
The integer value: 5
The thread 0x17f0 has exited with code 0 (0x0).
The integer value: 5
The integer value: 5
The thread 0x10f4 has exited with code 0 (0x0).
The integer value: 5
The thread 0x1488 has exited with code 0 (0x0).
The integer value: 5
The thread 0x684 has exited with code 0 (0x0).
Beachten Sie, dass alle Teilnehmer den Wert 5 gedruckt, nicht 0 durch 4. Dies liegt daran, dass die ThreadStart-Delegierten die Variable "i" verwenden, wie sie zum Zeitpunkt der Ausführung vorliegt, und nicht zum Zeitpunkt der Erstellung des Delegaten. Jede Änderung (i ++ in der Schleife) an den Parameter nach dem Zeitpunkt der Erstellung des Delegaten spiegelt sich im Wert des Parameters wider, wenn der Delegat ausgeführt wird.
Eine Lösung für dieses Problem ist die Verwendung von ParameterizedThreadStart und einer benutzerdefinierten Klasse, die alle Ihre Parameter aggregiert (wenn es mehr gibt). Mit parameterizedThreadStart übergeben Sie die Parameter zum Zeitpunkt der Ausführung. Dies würde in etwa so aussehen:
class CustomParameters
{
public int IntValue { get; set; }
public string FriendlyMessage { get; set; }
}
private void CreateAndRunThreadsWithParams()
{
List<ParameterizedThreadStart> threadStartsList = new List<ParameterizedThreadStart>();
//delegate creation
for (int i = 0; i < 5; i++)
{
ParameterizedThreadStart ts = delegate(object o) { PrintCustomParams((CustomParameters)o); };
threadStartsList.Add(ts);
}
//delegate execution
for (int i=0;i<threadStartsList.Count;i++)
{
Thread t = new Thread(threadStartsList[i]);
t.Start(new CustomParameters() { IntValue = i, FriendlyMessage = "Hello friend! Your integer value is:{0}"});
}
}
private void PrintCustomParams(CustomParameters customParameters)
{
Debug.WriteLine(string.Format(customParameters.FriendlyMessage, customParameters.IntValue));
}
Der Ausgang hier gezeigt wird:
Hello friend! Your integer value is:1
The thread 0x1510 has exited with code 0 (0x0).
Hello friend! Your integer value is:0
The thread 0x13f4 has exited with code 0 (0x0).
Hello friend! Your integer value is:2
The thread 0x157c has exited with code 0 (0x0).
Hello friend! Your integer value is:3
The thread 0x14e4 has exited with code 0 (0x0).
Hello friend! Your integer value is:4
The thread 0x1738 has exited with code 0 (0x0).
(Die Reihenfolge der Ausführung nicht deterministisch ist, es ist ein Rennen zwischen den Fäden)
für C# 3.0 Sie können vermeiden, dass das hässliche Objekt-Array mit anonymen Methoden übergibt:
void Run()
{
string param1 = "hello";
int param2 = 42;
Thread thread = new Thread(delegate()
{
MyMethod(param1,param2);
});
thread.Start();
}
void MyMethod(string p,int i)
{
}
einer der einfachsten Weg t o Pass Parameter als
Thread xmlThread =new Thread(()=>WriteLog(LogTypes.Message, "Flag", "Module", "Location", "Text", "Stacktrace"));
xmlThread.Start();
private object WriteLog(LogTypes logTypes, string p, string p_2, string p_3, string p_4, string p_5)
{
}
public void Start()
{
var t1 = new Thread((message) => { Console.WriteLine(message); });
//the parametirized threadstart accepts objects, it is not generic
var t2 = new Thread(number => { var num = (int)number;
Console.WriteLine(num++);
});
var t3 = new Thread((vals)=> work(vals));
t1.Start();
t2.Start();
t3.Start(20);
}
public void work(params object[] vals)
{
}
- 1. Parameter an Java übergeben Thread
- 2. Übergeben Sie einen Parameter an OWIN-Host
- 3. C# - Wie man einen Typ als Parameter übergeben
- 4. Übergeben von Datum als Parameter an einen Unterbericht/einen anderen Bericht zur Verwendung als Parameter
- 5. Wie Parameter übergeben einen Anruf an Logger.info?
- 6. Übergeben von mehr als 1 Argument an einen Konverter
- 7. Parameter an einen Laufzeit-Ereignis-Listener übergeben?
- 8. Übergeben einer Nachricht an einen anderen Thread in C#
- 9. Was passiert, wenn Sie einen int an einen Byte-Parameter in C übergeben?
- 10. Übergeben eines Objekts als Parameter an einen Windows-Dienst
- 11. Parameter mit ksoap2 an einen Webservice übergeben?
- 12. Mehrere Parameter an einen Controller übergeben?
- 13. JavaFX: Verwenden Sie einen Thread mehr als einmal
- 14. Wie übergeben Sie eine lokale Struktur als Parameter an pthread_create?
- 15. Wie Sie eine System.Drawing.Size als Parameter an eine Methode übergeben
- 16. Können Sie einen zusätzlichen Parameter an ein Prädikat übergeben?
- 17. null als Kontext an einen Funktionsaufruf übergeben
- 18. Wie übergeben Parameter an einen Befehl bcp in SQL-Server
- 19. Übergeben Sie einen nicht statischen Wert an einen Actionfilter
- 20. Wie übergeben Sie Parameter von C# an MATLAB?
- 21. Wie übergeben Sie ein JSON-Objekt an einen MVC-Aktionsparameter?
- 22. Übergeben Sie einen Parameter preparedForSegue von Funktion
- 23. Wie hashtable an einen Skriptblock übergeben?
- 24. Nehmen Sie einen URI als Parameter
- 25. PowerShell: Blöcke als Parameter an Funktionen übergeben
- 26. Übergeben von Identitätswechsel-Token für einen verwalteten Thread an einen nicht verwalteten Thread
- 27. Übergeben Sie einen Dateinamen als Befehlszeilenargument an GNU Octave-Skript
- 28. Wie kann ich Parameter an einen RequestHandler übergeben?
- 29. Wie kann ich alle Parameter an einen Dekorateur übergeben?
- 30. Wie boolean Parameter an einen erholsamen Service übergeben werden?
'new Thread (() => A ("Wort", 10))' für C# 3 + einzufädeln. – Dykam
Genau. Ich dachte an .NET 2.0. –
@Dykam, können Sie die Bedeutung von "() =>" in dem von Ihnen angegebenen Beispiel erläutern (neuer Thread ((=) => A ("Wort", 10))) – Techee