// 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);
Чарльз, твой код (выше) не верен. Вам не нужно вращаться, дождитесь завершения. EndInvoke будет блокироваться, пока не будет получено сообщение WaitHandle.
Если вы хотите заблокировать до завершения вам просто нужно
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
или в качестве альтернативы
ar.AsyncWaitHandle.WaitOne();
Но какой смысл делать вызовы anyc, если вы блокируете? Вы могли бы также просто использовать синхронный вызов. Лучше было бы не блокировать и передавать лямбду для очистки:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Следует иметь в виду, что вы должны вызывать EndInvoke. Многие люди забывают об этом и в итоге пропускают WaitHandle, так как большинство асинхронных реализаций выпускают дескриптор ожидания в EndInvoke.