// 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, seu código (acima) não está correto. Você não precisa girar a espera para concluir. EndInvoke bloqueará até que o WaitHandle seja sinalizado.
Se você deseja bloquear até a conclusão, basta
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
ou alternativamente
ar.AsyncWaitHandle.WaitOne();
Mas qual é o sentido de emitir chamadas anyc se você bloquear? Você também pode usar uma chamada síncrona. Uma aposta melhor seria não bloquear e passar um lambda para limpeza:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Uma coisa a ter em mente é que você deve ligar para o EndInvoke. Muitas pessoas esquecem isso e acabam vazando o WaitHandle, pois a maioria das implementações assíncronas libera o handhandle no EndInvoke.