internal void SponsorCallback(IAsyncResult iar)
{
BCLDebug.Trace("REMOTE","Lease ",id," SponsorCallback IAsyncResult ",iar," state ",((Enum)state).ToString());
if (state == LeaseState.Expired)
{
return;
}
int thisThread = Thread.CurrentThread.GetHashCode();
if (thisThread == sponsorCallThread)
{
WaitCallback threadFunc = new WaitCallback(this.SponsorCallback);
ThreadPool.QueueUserWorkItem(threadFunc, iar);
return;
}
AsyncResult asyncResult = (AsyncResult)iar;
AsyncRenewal ar = (AsyncRenewal)asyncResult.AsyncDelegate;
ISponsor sponsor = (ISponsor)ar.Target;
SponsorStateInfo sponsorStateInfo = null;
if (iar.IsCompleted)
{
// Sponsor came back with renewal
BCLDebug.Trace("REMOTE","Lease ",id," SponsorCallback sponsor completed");
bool exceptionOccurred = false;
TimeSpan renewalTime = TimeSpan.Zero;
try
{
renewalTime = (TimeSpan)ar.EndInvoke(iar);
}catch(Exception)
{
// Sponsor not avaiable
exceptionOccurred = true;
}
if (exceptionOccurred)
{
BCLDebug.Trace("REMOTE","Lease ",id," SponsorCallback Sponsor Exception ");
Unregister(sponsor);
ProcessNextSponsor();
}
else
{
Object sponsorId = GetSponsorId(sponsor);
lock(sponsorTable)
{
if (sponsorTable.ContainsKey(sponsorId))
{
sponsorStateInfo = (SponsorStateInfo)sponsorTable[sponsorId];
sponsorStateInfo.sponsorState = SponsorState.Completed;
sponsorStateInfo.renewalTime = renewalTime;
}
else
{
// Sponsor was deleted, possibly from a sponsor time out
}
}
if (sponsorStateInfo == null)
{
// Sponsor was deleted
ProcessNextSponsor();
}
else if (sponsorStateInfo.renewalTime == TimeSpan.Zero)
{
BCLDebug.Trace("REMOTE","Lease ",id," SponsorCallback sponsor did not renew ");
Unregister(sponsor);
ProcessNextSponsor();
}
else
Renew(sponsorStateInfo.renewalTime);
}
}
else
{
// Sponsor timed out
// Note time outs should be handled by the LeaseManager
BCLDebug.Trace("REMOTE","Lease ",id," SponsorCallback sponsor did not complete, timed out");
Unregister(sponsor);
ProcessNextSponsor();
}
}