/// <summary>
/// Waits for a work item or exits on timeout or cancel
/// </summary>
/// <param name="millisecondsTimeout">Timeout in milliseconds</param>
/// <param name="cancelEvent">Cancel wait handle</param>
/// <returns>Returns true if the resource was granted</returns>
public WorkItem DequeueWorkItem(int millisecondsTimeout, WaitHandle cancelEvent)
{
WaiterEntry newWaiterEntry = null;
WorkItem workItem = null;
lock (this)
{
this.ValidateNotDisposed();
if (this._workItems.Count > 0)
{
return(this._workItems.Dequeue() as WorkItem);
}
newWaiterEntry = this.GetThreadWaiterEntry();
this.PushWaiter(newWaiterEntry);
}
WaitHandle[] waitHandles = new WaitHandle[] { newWaiterEntry.WaitHandle, cancelEvent };
int num = WaitHandle.WaitAny(waitHandles, millisecondsTimeout, true);
lock (this)
{
bool flag = 0 == num;
if (!flag)
{
bool flag2 = newWaiterEntry.Timeout();
if (flag2)
{
this.RemoveWaiter(newWaiterEntry, false);
}
flag = !flag2;
}
if (flag)
{
workItem = newWaiterEntry.WorkItem;
if (workItem == null)
{
workItem = this._workItems.Dequeue() as WorkItem;
}
}
}
return(workItem);
}