private async Task DoEnqueue(T item, TimeSpan?initialVisibilityDelay) { string serializedItem = _serializer.Serialize(item); string blobname = $"{Guid.NewGuid()}.que"; try { using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(serializedItem))) { await _blobRepository.UploadAsync(blobname, stream); } } catch (Exception ex) { throw new LargeMessageQueueException("Unable to upload blob to blob store. No item queued.", ex, blobname); } try { if (initialVisibilityDelay.HasValue) { await _referenceQueue.EnqueueAsync(new LargeMessageReference { BlobReference = blobname }, initialVisibilityDelay.Value); } else { await _referenceQueue.EnqueueAsync(new LargeMessageReference { BlobReference = blobname }); } } catch (Exception ex) { throw new LargeMessageQueueException("Error enqueuing item, blob may be orphaned", ex, blobname); } }
/// <summary> /// Insert an item into the current queue. Calling this method is equivalent to calling /// <see cref="IAsyncQueue{T}.EnqueueAsync(T, CancellationToken)"/> with a value of /// <see cref="CancellationToken.None"/>. /// </summary> /// <typeparam name="T">The type of the queued items.</typeparam> /// <param name="queue">The current <see cref="IAsyncQueue{T}"/> implementation.</param> /// <param name="item">An object of the queued type.</param> /// <returns> /// A value indicating whether or not the enqueue operation was successful. /// </returns> public static Task <bool> EnqueueAsync <T>(this IAsyncQueue <T> queue, T item) { return(queue.EnqueueAsync(item, CancellationToken.None)); }