// 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 kodunuz (yukarıda) doğru değil. Tamamlanması için döndürmeyi beklemenize gerek yoktur. EndInvoke, WaitHandle sinyali verilene kadar bloke olur.
Tamamlanıncaya kadar engellemek istiyorsanız,
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
Veya alternatif olarak
ar.AsyncWaitHandle.WaitOne();
Ancak, engellerseniz anyc çağrıları yapmanın anlamı nedir? Senkronize bir çağrı da kullanabilirsiniz. Daha iyi bir bahis, temizlik için bir lambda'yı engellememek ve geçmek değil:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Akılda tutulması gereken bir şey, EndInvoke'u aramanız gerektiğidir . Çoğu insan bunu unutur ve çoğu asenkron uygulama EndInvoke'deki bekleme kolunu serbest bıraktığından WaitHandle'ı sızdırır.