// 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 รหัสของคุณ (ด้านบน) ไม่ถูกต้อง คุณไม่จำเป็นต้องหมุนรอจนเสร็จ EndInvoke จะบล็อกจนกว่าจะส่งสัญญาณ WaitHandle
หากคุณต้องการบล็อกจนกว่าจะเสร็จสมบูรณ์คุณก็ต้อง
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
หรืออีกวิธีหนึ่ง
ar.AsyncWaitHandle.WaitOne();
แต่สิ่งที่เป็นจุดของการออกสายใด ๆ ถ้าคุณบล็อก? คุณอาจใช้สายซิงโครนัสก็ได้เช่นกัน ทางออกที่ดีกว่าคือการไม่ปิดกั้นและผ่านเข้าไปในแลมบ์ดาเพื่อทำความสะอาด:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
สิ่งหนึ่งที่ต้องจำไว้คือคุณต้องโทรหา EndInvoke ผู้คนจำนวนมากลืมสิ่งนี้และจบลงด้วยการรั่วไหลของ WaitHandle เนื่องจากการใช้งาน async ส่วนใหญ่จะปล่อย waithandle ใน EndInvoke