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!
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.
Sie blockieren sofort Ihren UIhread, wenn Sie dl.EndInvoke(ar)
aufrufen. Diese Art besiegt den ganzen Zweck eines asynchronen Anrufs.
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
):
Ich vermute, Sie wollen nicht blockieren, in welchem Fall "fire and forget" die wenigsten Kopfschmerzen verursacht.
Tags und Links c# multithreading begininvoke