// following declaration of delegate ,,,
public delegate long GetEnergyUsageDelegate(DateTime lastRunTime,
DateTime procDateTime);
// following inside of some client method
GetEnergyUsageDelegate nrgDel = GetEnergyUsage;
IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null);
while (!aR.IsCompleted) Thread.Sleep(500);
int usageCnt = nrgDel.EndInvoke(aR);
Charles votre code (ci-dessus) n'est pas correct. Vous n'avez pas besoin de tourner pour attendre la fin. EndInvoke se bloquera jusqu'à ce que le WaitHandle soit signalé.
Si vous souhaitez bloquer jusqu'à la fin, vous devez simplement
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
Ou bien
ar.AsyncWaitHandle.WaitOne();
Mais quel est l'intérêt d'émettre des appels anyc si vous bloquez? Vous pourriez tout aussi bien utiliser un appel synchrone. Un meilleur pari serait de ne pas bloquer et passer une lambda pour le nettoyage:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Une chose à garder à l'esprit est que vous devez appeler EndInvoke. Beaucoup de gens oublient cela et finissent par perdre le WaitHandle car la plupart des implémentations asynchrones libèrent le waithandle dans EndInvoke.