private async Task <WorkItem> ReceiveNext() { int N = queue.Count; if (localQueue.Count > 0 && N == 0) { return(localQueue.Dequeue()); } if (localQueue.Count == 0 && N == 0) { localQueue.Enqueue(await queue.ReceiveAsync()); return(await ReceiveNext()); } for (int i = 0; i < N; ++i) { WorkItem item = await queue.ReceiveAsync(); localQueue.Enqueue(item); } PrioritizeAndCompressLocalQueue(); return(localQueue.Dequeue()); }
public static async Task RunAsyncQueueAsync(int count) { var cancellationToken = CancellationToken.None; var target = new AsyncQueue <string>(count, count); var PostTasks = new Task[count]; var dequeueTasks = new Task <string> [count]; var PostSetupTask = Task.Run(() => { for (int i = 0; i < count; i++) { var item = "HVQFSW613ACT65DOS2ILBA4G4QB3UP3K4PPZPB7UZ771SX9TX7DVNZR82W1TSHWDBZHIE8V6CGILADRFQ3QA76BOYA4T3XS7A8OQ3I2FCT8X04L2GXR3RY23WB2A0ZLNT58WCMZTY54PRPOVVENCMOJMCZC6D85H9HPGJ58BBOHN7PJ0G3QTDSB8K4ACT26QXG5D30WI"; PostTasks[i] = Task.Run(() => target.Post(item)); } }); var dequeueSetupTask = Task.Run(() => { for (int i = 0; i < count; i++) { dequeueTasks[i] = target.ReceiveAsync(cancellationToken); } }); await Task.WhenAll(PostSetupTask, dequeueSetupTask); await Task.WhenAll(dequeueTasks); await Task.WhenAll(PostTasks); if (target.BufferCount != 0 || target.PromisesCount != 0) { System.Console.WriteLine("AsyncQueue - Not empty"); } }
public static async Task RunAsyncQueueAsync(int count) { var cancellationToken = CancellationToken.None; var target = new AsyncQueue<string>(count, count); var PostTasks = new Task[count]; var dequeueTasks = new Task<string>[count]; var PostSetupTask = Task.Run(() => { for (int i = 0; i < count; i++) { var item = "HVQFSW613ACT65DOS2ILBA4G4QB3UP3K4PPZPB7UZ771SX9TX7DVNZR82W1TSHWDBZHIE8V6CGILADRFQ3QA76BOYA4T3XS7A8OQ3I2FCT8X04L2GXR3RY23WB2A0ZLNT58WCMZTY54PRPOVVENCMOJMCZC6D85H9HPGJ58BBOHN7PJ0G3QTDSB8K4ACT26QXG5D30WI"; PostTasks[i] = Task.Run(() => target.Post(item)); } }); var dequeueSetupTask = Task.Run(() => { for (int i = 0; i < count; i++) { dequeueTasks[i] = target.ReceiveAsync(cancellationToken); } }); await Task.WhenAll(PostSetupTask, dequeueSetupTask); await Task.WhenAll(dequeueTasks); await Task.WhenAll(PostTasks); if (target.BufferCount != 0 || target.PromisesCount != 0) { System.Console.WriteLine("AsyncQueue - Not empty"); } }