Warum ist meine BeginInvoke-Methode nicht asynchron?

8

Um das Einfrieren der GUI zu vermeiden, wollte ich die Methode asynchron mit der DB verbinden. Deshalb habe ich folgendes geschrieben:

%Vor%

Aber es ist immer noch eiskalt und ich verstehe nicht warum. Ich dachte, BeginInvoke stellt sicher, dass der aufgerufene Code in einem anderen Thread ausgeführt wird. Danke!

    
Petr 05.05.2010, 09:24
quelle

7 Antworten

12

Das Aufrufen von EndInvoke () blockiert solange, bis der Aufruf von BeginInvoke () abgeschlossen ist.

Sie benötigen diese Art von Muster, damit Ihre langanhaltende Methode nach Abschluss einen Rückruf aufruft:

%Vor%     
RickL 05.05.2010, 09:26
quelle
5

Siehe die Beschreibung von EndInvoke hier , insbesondere:

  

Die Funktion EndInvoke () wird verwendet   Abrufen der Ergebnisse der   asynchroner Anruf Es kann angerufen werden   jederzeit nach BeginInvoke (). Wenn die   asynchroner Aufruf wurde nicht abgeschlossen   noch, EndInvoke () blockiert bis es   schließt ab.

    
Chris Schmich 05.05.2010 09:27
quelle
2

Sie blockieren sofort Ihren UIhread, wenn Sie dl.EndInvoke(ar) aufrufen. Diese Art besiegt den ganzen Zweck eines asynchronen Anrufs.

    
Anton Gogolev 05.05.2010 09:26
quelle
1

Es gibt vier verschiedene Muster für die Verwendung des asynchronen Modells in .NET. as Diese Frage deckt sich sehr gut.

Sie verwenden den Ansatz "Ich rufe Sie an" . Wenn Sie jedoch warten möchten, bis das Workitem beendet ist, verwenden Sie am besten ein Mutex (das WaitHandle ):

%Vor%

Ich vermute, Sie wollen nicht blockieren, in welchem ​​Fall "fire and forget" die wenigsten Kopfschmerzen verursacht.

    
Chris S 12.05.2010 09:26
quelle
0

Geben Sie eine Methode an, die aufgerufen werden soll, wenn der Aufruf in BeginInvoke abgeschlossen ist (wie dl.BeginInvoke (null, OnConnectCompleted)). Dann wird der Thread nicht blockiert.

    
JWL_ 05.05.2010 09:28
quelle
0

Warum nicht einfach einen BackgroundWorker verwenden?

    
James 05.05.2010 09:48
quelle
0

Call to EndInvoke wird Ihren aktuellen Thread blockieren. Sie sollten einen Delegaten in BeginInvoke übergeben, anstatt EndInvoke aufzurufen

    
labadana 05.05.2010 10:57
quelle

Tags und Links