// 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);
चार्ल्स आपका कोड (ऊपर) सही नहीं है। आपको पूरा होने के लिए इंतजार करने की जरूरत नहीं है। जब तक WaitHandle सिग्नल नहीं हो जाता तब तक EndInvoke ब्लॉक हो जाएगा।
यदि आप पूरा होने तक ब्लॉक करना चाहते हैं तो आपको बस जरूरत है
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
या वैकल्पिक रूप से
ar.AsyncWaitHandle.WaitOne();
लेकिन अगर आप ब्लॉक करते हैं तो एनओसी कॉल जारी करने का क्या मतलब है? आप बस एक तुल्यकालिक कॉल का उपयोग कर सकते हैं। एक बेहतर शर्त यह होगी कि सफाई के लिए लंबोदर को ब्लॉक और पास न किया जाए:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
एक बात का ध्यान रखें कि आप EndInvoke को अवश्य कॉल करें। बहुत से लोग इसे भूल जाते हैं और अंत में वेटहैंडल को लीक कर देते हैं क्योंकि अधिकांश एसिंक्स कार्यान्वयन एंडएंडवोक में वेटहैंडल जारी करते हैं।