in src/DurableTask.Emulator/PeekLockSessionQueue.cs [160:194]
public async Task<TaskSession> AcceptSessionAsync(TimeSpan receiveTimeout, CancellationToken cancellationToken)
{
Stopwatch timer = Stopwatch.StartNew();
while (timer.Elapsed < receiveTimeout && !cancellationToken.IsCancellationRequested)
{
lock (this.thisLock)
{
foreach (TaskSession ts in this.sessionQueue)
{
if (ts.Messages.Count > 0 && !ts.Messages.Any(m => m.Event is ExecutionStartedEvent ese && ese.ScheduledStartTime > DateTime.UtcNow))
{
this.lockedSessionQueue.Add(ts);
this.sessionQueue.Remove(ts);
// all messages are now locked
foreach (TaskMessage tm in ts.Messages)
{
ts.LockTable.Add(tm);
}
return ts;
}
}
}
await Task.Delay(TimeSpan.FromMilliseconds(500), cancellationToken);
}
if (cancellationToken.IsCancellationRequested)
{
throw new TaskCanceledException();
}
return null;
}