Skip to content

Instantly share code, notes, and snippets.

@PureKrome
Created February 15, 2016 04:10
Show Gist options
  • Save PureKrome/8aa486b0440d4147ccc3 to your computer and use it in GitHub Desktop.
Save PureKrome/8aa486b0440d4147ccc3 to your computer and use it in GitHub Desktop.
Async awaity stuff with Azure queues - props to Ben Adams for the answer
private ConcurrentQueue<Message> _queue = new ConcurrentQueue<Message>();
private SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
public async Task DoTheThing()
{
var tasks = new Task[20];
for (var i = 0; i < tasks.Length; i++)
{
tasks[i] = UploadMessages();
}
await Task.WhenAll(tasks).ConfigureAwait(false);
}
public async Task UploadMessages()
{
Message message;
while ((message = await GetMessage().ConfigureAwait(false)) != null)
{
await ProcessMessageAsync(message).ConfigureAwait(false);
}
}
public async Task<int> GetMessage()
{
Message message;
if (_queue.TryDequeue(out message))
{
return message;
}
else
{
await _semaphore.WaitAsync().ConfigureAwait(false);
if (_queue.TryDequeue(out message))
{
return message;
}
try
{
var messages = await _imageQueue.GetMessagesAsync(10, TimeSpan.FromMinutes(1)).ConfigureAwait(false);
var isFirst = false;
foreach (var m in messages)
{
if (isFirst)
{
message = m;
}
else
{
_queue.Enqueue(m);
}
}
return message;
}
finally
{
_semaphore.Release();
}
}
}
2:37:19 PM
ben_a_adams
rather
2:37:40 PM
Paste (click to show/hide)
foreach (var m in messages)
{
if (isFirst)
{
message = m;
isFirst = false;
}
else
{
_queue.Enqueue(m);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment