Sto esaminando le opzioni per eseguire l'invio di eventi asincroni in un componente che ha molti sottoscrittori dei suoi eventi. Nella lettura delle opzioni, mi sono imbattuto in questo esempio:Aumentare gli eventi in modo asincrono
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);
}
}
Al di là della sintassi precedente (il campione era di .NET 1.1), sembra a me come questa è una grave perdita di risorse. Non esiste alcun metodo di completamento, nessun polling per il completamento o qualsiasi altro modo che verrà chiamato EndInvoke
.
La mia comprensione è che ogni BeginInvoke
deve avere un corrispondente EndInvoke
. Altrimenti ci sono in sospeso le istanze degli oggetti AsyncResult
, insieme alle (potenzialmente) eccezioni che sono state sollevate durante gli eventi asincroni.
Mi rendo conto che è abbastanza facile cambiarlo fornendo una richiamata e facendo un EndInvoke
, ma se non è necessario. . .
La gestione delle eccezioni asincrone è completamente diversa e, combinata con la necessità di sincronizzarsi con il thread dell'interfaccia utente (ad esempio InvokeRequired
, ecc.) Potrebbe benissimo racchiudere l'intera idea di queste notifiche asincrone.
Così, due domande:
- Am Ho ragione a credere che ogni
BeginInvoke
richiede un corrispondenteEndInvoke
? - Oltre a ciò che ho notato sopra, ci sono altre insidie a fare notifiche di eventi asincroni nelle applicazioni Windows Form?
Perché si desidera effettuare la distribuzione in modo asincrono? Hai fatto un'analisi delle prestazioni che mostra questo sarebbe di beneficio? In caso contrario, più thread potrebbero peggiorare la situazione. –
Sì, ho eseguito l'analisi delle prestazioni per determinare se l'elaborazione asincrona sarebbe un vantaggio. –