Warum asynchrone Delegaten-Methode erfordern den Aufruf von EndInvoke?
Warum wird der Delegat-Aufruf müssen die EndInvoke, bevor die Methode feuert? Wenn muss ich anrufen die EndInvoke (die Blöcke der thread) dann ist nicht wirklich ein asynchroner Aufruf ist es?
Hier ist der code, den ich versuche zu laufen.
class Program
{
private delegate void GenerateXmlDelegate();
static void Main(string[] args)
{
GenerateXmlDelegate worker = new GenerateXmlDelegate(GenerateMainXml);
IAsyncResult result = worker.BeginInvoke(null, null);
}
private static void GenerateMainXml()
{
Thread.Sleep(10000);
Console.WriteLine("GenerateMainXml Called by delegate");
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum Sie benötigen, rufen Sie
EndInvoke
ist um Speicherverluste zu vermeiden; .Net speichern von Informationen über das Ergebnis der Funktion (bzw. die Ausnahme), bis Sie den AnrufEndInvoke
.Können Sie anrufen
EndInvoke
im completion handler, die Sie geben, umBeginInvoke
und behalten die asynchrone Natur.BEARBEITEN:
Beispiel:
Wenn Sie möchten, um das Feuer einen asynchronen Aufruf, und vergessen Sie es, können Sie die - ThreadPool -, wie diese:
Begin/End-Invoke
Paaren - ein Beispiel ist: wenn Sie don ' T callEnd*
aufSocket
Operationen der Buchse Leistungsindikatoren gehen vollständig aus dem Gleichgewicht geraten (kein memory-leak, die Werte werden einfach völlig falsch).Als SLaks sagte
EndInvoke
versichert gegen Speicherlecks.BeginInvoke
ist immer noch asynchron; betrachten Sie den folgenden code:Wenn Sie diesen code schreiben, ohne die
BeginInvoke
/EndInvoke
fordertPerformSlowCalculation
würde zu beenden, bevorMain
tun konnte, der rest seiner "viel Zeug"; auf diese Weise können die beiden die passiert werden in der gleichen Zeit.Nun, in deinem Beispiel mit einem
GenerateXmlDelegate
, müssen Sie nochEndInvoke
auch wenn Sie sich nicht wieder etwas. Die Art und Weise, dies zu tun ist: