2011-01-11 8 views
0


pls Blick auf folgende Stück Code.BeginInvoke: Zu viele Anrufe gemacht

for (int j = 0; j < 500000; j++) 
{ 
    Console.WriteLine(j); 

    // Call BeginInvoke with last two parameters as null 

    IAsyncResult asyncRes = dlg.BeginInvoke(j, 4, ref refString, out outString, progressCallBack, null); 
} 

Wenn die Methode, die asynchron aufgerufen wird, für 5 Minuten ruht. dann ist es richtig, dass 5 lac-threads erstellt wurden?

Danke.

+0

hängt davon ab, was 'dlg' ist. –

+0

dlg ist Objekt der * öffentlichen Delegate Zeichenfolge TimeConsumerDelegate (int a, int b, ref Zeichenfolge c, out Zeichenfolge d); * – Azodious

Antwort

4

Das ist im Allgemeinen nicht wahr. Wenn Sie BeginInvoke für einen Delegaten aufrufen, stellen Sie eine asynchrone Methodenausführung bereit.

Die .NET Threadpool entscheidet, wann und wie Sie Ihre Methode basierend auf der Warteschlange der zu verarbeitenden Workitems mit dem Ziel des maximalen Datendurchsatzes ausführen, aber 500000 Threads werden nicht parallel ausgeführt.

Als ich versuchte, aus Ihrem Beispiel mit einem Schlaf von 5 Minuten und eine kleinen Konsole Nachricht in den Delegaten nur 8 Threads ausgeführt wurden zunächst, dann langsam mehr wurden rieselt in.

Für eine gute Erklärung für den Thread-Pool und asynchrone Delegaten lesen this article.

+0

Ich stimme zu, dass 500000 Lac-Threads nicht parallel ausgeführt werden. Mein Prozessor ist Core 2 Quad 4, also maximal 1000 Threads. ist das richtig? zwei weitere Zweifel: Sie sagten _ vorausgesetzt, dass dlg funktioniert wie erwartet_: ist der unerwartete Weg? und wenn du Schlange sagst. ist es FIFO? – Azodious

+0

Ich schrieb * vorausgesetzt dlg funktioniert wie erwartet * bevor Sie geklärt haben, dass es ein Delegierter ist, habe ich meinen Beitrag entsprechend bearbeitet. Bis zu .NET 4-Workitems werden in FIFO-Reihenfolge eingereiht und eingereiht, die Situation ist mit dem .NET 4-Thread-Pool komplexer, da für jeden Worker-Thread im Thread-Pool lokale Warteschlangen vorhanden sind. – BrokenGlass

+0

Danke für den Link. Es hat viele neue Informationen für mich. Kannst du bitte auch erzählen, wie du herausgefunden hast, wie viele Threads laufen? Wenn ich ManagedThreadId drucke, ist dies für jeden Aufruf von BeignInvoke unterschiedlich. – Azodious