// 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();
Але який сенс видавати будь-які дзвінки, якщо ви блокуєте? Ви можете просто використовувати синхронний дзвінок. Краще зробити ставку не заблокувати та пропустити в лямбда на прибирання:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Варто пам’ятати, що ви повинні зателефонувати в EndInvoke. Багато людей забувають про це і в кінцевому підсумку витікають WaitHandle, оскільки більшість асинхронних програм випускає чеканку в EndInvoke.