// 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 mã của bạn (ở trên) là không chính xác. Bạn không cần phải quay chờ đợi để hoàn thành. EndInvoke sẽ chặn cho đến khi WaitHandle được báo hiệu.
Nếu bạn muốn chặn cho đến khi hoàn thành, bạn chỉ cần
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
Hay cách khác
ar.AsyncWaitHandle.WaitOne();
Nhưng điểm phát hành cuộc gọi anyc là gì nếu bạn chặn? Bạn cũng có thể chỉ cần sử dụng một cuộc gọi đồng bộ. Đặt cược tốt hơn là không chặn và vượt qua trong lambda để dọn dẹp:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Một điều cần lưu ý là bạn phải gọi EndInvoke. Rất nhiều người quên điều này và cuối cùng đã rò rỉ WaitHandle vì hầu hết các triển khai async đều phát hành waithandle trong EndInvoke.