// 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 kode Anda (di atas) tidak benar. Anda tidak perlu berputar menunggu sampai selesai. EndInvoke akan memblokir hingga WaitHandle diberi sinyal.
Jika Anda ingin memblokir hingga selesai, Anda hanya perlu melakukannya
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
atau sebagai alternatif
ar.AsyncWaitHandle.WaitOne();
Tapi apa gunanya mengeluarkan panggilan telepon jika Anda memblokir? Anda mungkin juga hanya menggunakan panggilan sinkron. Taruhan yang lebih baik adalah dengan tidak memblokir dan meneruskan lambda untuk pembersihan:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Satu hal yang perlu diingat adalah Anda harus menelepon EndInvoke. Banyak orang lupa ini dan akhirnya membocorkan WaitHandle karena kebanyakan implementasi async melepaskan waithandle di EndInvoke.