// 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 su código (arriba) no es correcto. No necesita girar, esperar a que se complete. EndInvoke se bloqueará hasta que se señale WaitHandle.
Si desea bloquear hasta su finalización, simplemente necesita
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
o alternativamente
ar.AsyncWaitHandle.WaitOne();
Pero, ¿cuál es el punto de emitir llamadas anyc si bloquea? También podría usar una llamada síncrona. Una mejor apuesta sería no bloquear y pasar una lambda para la limpieza:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Una cosa a tener en cuenta es que debe llamar a EndInvoke. Mucha gente olvida esto y termina filtrando WaitHandle, ya que la mayoría de las implementaciones asíncronas lanzan waithandle en EndInvoke.