using System.Threading.Tasks;
using System.Collections.Concurrent;
public static void Main()
.Select(i => Task.Factory.StartNew(() => proxy.UploadAndImport(new Request(i))))
Task.WhenAll(tasks).GetAwaiter().GetResult();
static Request _importInProgressItem = null;
static readonly ConcurrentQueue<Request> ImportQueue = new ConcurrentQueue<Request>();
public void UploadAndImport(Request request)
ImportFileSynchronized(request);
private void ImportFileSynchronized(Request request)
ImportQueue.Enqueue(request);
ImportQueue.TryPeek(out var next);
if (null != Interlocked.CompareExchange(ref _importInProgressItem, next, null))
ImportQueue.TryDequeue(out _);
Interlocked.Exchange(ref _importInProgressItem, null);
while (ImportQueue.Any());
public bool UploadAndImportIsComplete(int operationId) => ImportQueue.All(waiting => waiting.OperationId != operationId);
void UploadFile(Request request) => Console.WriteLine($"Uploaded {request.OperationId} on {Thread.CurrentThread.ManagedThreadId}");
void ImportFile(Request request) => Console.WriteLine($"Imported {request.OperationId} on {Thread.CurrentThread.ManagedThreadId}");