Wenn ich den Code unten ausführen, ist die Ausgabe "DelegateDisplayIt", in der Regel 1-4 mal wiederholt. Ich habe diesen Code wahrscheinlich 100 Mal ausgeführt, und nicht einmal die Ausgabe war jemals "ParameterizedDisplayIt". Es scheint also die Art und Weise, in der der Thread erstellt und anschließend gestartet wird, wie der Parameter übergeben wird. Beim Erstellen eines neuen Threads mit einem anonymen Delegaten ist der Parameter ein Verweis auf die ursprüngliche Variable. Wenn er jedoch mit einem ParameterizedThreadStart-Delegat erstellt wird, ist der Parameter ein völlig neues Objekt. Scheint meine Annahme richtig? Wenn dem so ist, scheint das ein seltsamer Nebeneffekt des Thread-Konstruktors zu sein, nicht?Unterschiedliches Verhalten beim Starten eines Threads: ParameterizedThreadStart vs. Anonymous Delegate. Warum spielt es eine Rolle?
static void Main()
{
for (int i = 0; i < 10; i++)
{
bool flag = false;
new Thread(delegate() { DelegateDisplayIt(flag); }).Start();
var parameterizedThread = new Thread(ParameterizedDisplayIt);
parameterizedThread.Start(flag);
flag = true;
}
Console.ReadKey();
}
private static void DelegateDisplayIt(object flag)
{
if ((bool)flag)
Console.WriteLine("DelegateDisplayIt");
}
private static void ParameterizedDisplayIt(object flag)
{
if ((bool)flag)
Console.WriteLine("ParameterizedDisplayIt");
}
Mit anderen Worten, Delegaten sind an Namen in ihren Bereichen gebunden, nicht an die Werte? Und ihre Parameter werden nur ausgewertet, wenn der Delegat tatsächlich aufgerufen wird, nicht wenn der Delegat selbst erstellt wird? –
Genau, du hast es großartig gemacht, es zu synthetisieren.Mein Englisch ist sehr schlecht :-( –
In Anbetracht Ihrer Reputation, Ihr Englisch ist genial :-) Allerdings schlagen andere Antworten vor, dies gilt nur für anonyme Delegierte. Kompliziert: -/ –