Created
February 15, 2016 04:10
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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