// 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);
চার্লস আপনার কোড (উপরে) সঠিক নয়। আপনার সমাপ্তির জন্য অপেক্ষা করতে হবে না। ওয়েটহ্যান্ডল সিগন্যাল না হওয়া অবধি এন্ডআইভোক ব্লক করবে।
আপনি যদি সম্পূর্ণ না হওয়া পর্যন্ত অবরুদ্ধ করতে চান তবে আপনার কেবল প্রয়োজন
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
বা বিকল্পভাবে
ar.AsyncWaitHandle.WaitOne();
আপনি যদি ব্লক করে থাকেন তবে যে কোনও কল দেওয়ার ইস্যুটি কী? আপনি পাশাপাশি কেবল একটি সিঙ্ক্রোনাস কল ব্যবহার করতে পারেন। আরও ভাল বাজি হ'ল ক্লিনআপের জন্য ল্যাম্বডায় অবরুদ্ধ না হয়ে প্রবেশ করা:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
একটি বিষয় মনে রাখবেন যে আপনাকে অবশ্যই এন্ডআইভোককে কল করতে হবে । অনেকগুলি এটিকে ভুলে যায় এবং ওয়েটহ্যান্ডলকে ফাঁস করে দেয় কারণ বেশিরভাগ অ্যাসিঙ্ক বাস্তবায়ন এন্ডআইভোকে ওয়েটহান্ডেল প্রকাশ করে।