Ich untersuche Optionen für die asynchrone Ereignisverteilung in einer Komponente, die viele Abonnenten für ihre Ereignisse hat. In den Optionen durchlesen, ich auf dieses Beispiel lief:Ereignisse asynchron auslösen
public event ValueChangedEvent ValueChanged;
public void FireEventAsync(EventArgs e)
{
Delegate[] delegates = ValueChanged.GetInvocationList();
foreach (Delegate d in delegates)
{
ValueChangedEvent ev = (ValueChangedEvent)d;
ev.BeginInvoke(e, null, null);
}
}
Jenseits der älteren Syntax (die Probe wurde von .NET 1.1), sieht es für mich so eine ernsthafte Ressource Leck ist. Es gibt keine Abschlussmethode, keine Abfrage zum Abschluss oder eine andere Art, wie EndInvoke
aufgerufen wird.
Mein Verständnis ist, dass jeder BeginInvoke
eine entsprechende EndInvoke
haben muss. Sonst sind AsyncResult
Objektinstanzen verfügbar, die herumschweben, zusammen mit (möglicherweise) Ausnahmen, die während der asynchronen Ereignisse ausgelöst wurden.
Ich realisiere, dass es einfach genug ist, das durch einen Rückruf zu ändern und eine EndInvoke
tun, aber wenn ich nicht brauche. . . Die Handhabung der asynchronen Ausnahmen ist eine ganz andere Sache, und kombiniert mit der Notwendigkeit, mit dem UI-Thread (d. H. InvokeRequired
, etc.) zu synchronisieren, könnte die ganze Idee, diese asynchronen Benachrichtigungen durchzuführen, sehr gut sein.
also zwei Fragen:
- Bin ich in der Annahme richtig, dass jeder
BeginInvoke
einEndInvoke
entsprechenden erfordert? - Abgesehen von dem, was ich oben erwähnt habe, gibt es andere Probleme zu tun, asynchrone Ereignisbenachrichtigungen in Windows Forms-Anwendungen?
Warum möchten Sie asynchron versenden? Haben Sie eine Leistungsanalyse durchgeführt, die zeigt, dass dies von Vorteil wäre? Wenn nicht, können mehrere Threads es schlechter machen. –
Ja, ich habe die Leistungsanalyse durchgeführt, um festzustellen, ob die asynchrone Verarbeitung von Vorteil ist. –