// 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 faire tourner l'attente de l'achèvement. EndInvoke bloquera jusqu'à ce que le WaitHandle soit signalé.
Si vous voulez bloquer jusqu'à l'achèvement, il vous suffit de
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
ou alternativement
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 choix serait de ne pas bloquer et de passer dans une lambda pour le nettoyage :
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Une chose à garder à l'esprit est que vous doit appeler EndInvoke. Beaucoup de gens oublient cela et finissent par laisser échapper le WaitHandle, car la plupart des implémentations asynchrones libèrent le waithandle dans EndInvoke.