// 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, dein Code (oben) ist nicht korrekt. Sie müssen nicht warten, bis der Vorgang abgeschlossen ist. EndInvoke wird blockiert, bis das WaitHandle signalisiert wird.
Wenn Sie bis zur Fertigstellung blockieren möchten, müssen Sie einfach
nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));
oder alternativ
ar.AsyncWaitHandle.WaitOne();
Aber was bringt es, wenn Sie blockieren, wenn Sie blockieren? Sie können auch einfach einen synchronen Anruf verwenden. Eine bessere Wette wäre, ein Lambda nicht zu blockieren und zur Bereinigung weiterzugeben:
nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);
Eine Sache im Auge zu behalten ist , dass Sie müssen EndInvoke nennen. Viele Leute vergessen dies und verlieren am Ende das WaitHandle, da die meisten asynchronen Implementierungen das Waithandle in EndInvoke freigeben.