/// <summary> /// Executes batch operations asynchronously. /// </summary> /// <param name="entities">List of entities.</param> /// <param name="operation">Table operation.</param> /// <param name="cancellationToken">Cancellation token.</param> /// <returns>Result entities.</returns> public override Task <IEnumerable <T> > ExecuteBatchesAsync(IEnumerable <T> entities, Func <ITableEntity, TableOperation> operation, CancellationToken cancellationToken) { if (entities == null) { throw new ArgumentNullException("entities"); } if (operation == null) { throw new ArgumentNullException("operation"); } IEnumerable <ITableEntity> tableEntities = entities.Select(p => _entityConverter.GetEntity(p)); IEnumerable <TableBatchOperation> batches = _partitioner.GetBatches(tableEntities, operation); var result = new List <T>(); IEnumerable <Task> tasks = batches.Select( p => _cloudTable .ExecuteBatchAsync(p, cancellationToken) .Then(results => result.AddRange(results.Select( tableResult => _entityConverter.GetEntity((DynamicTableEntity)tableResult.Result))), cancellationToken)); return(TaskHelpers.Iterate(tasks, cancellationToken) .Then(() => result.AsEnumerable(), cancellationToken)); }
/// <summary> /// Executes batch operations asynchronously. /// </summary> /// <param name="entities">List of entities.</param> /// <param name="operation">Table operation.</param> /// <param name="cancellationToken">Cancellation token.</param> /// <returns>Result entities.</returns> public override Task <IEnumerable <T> > ExecuteBatchesAsync(IEnumerable <T> entities, Func <ITableEntity, TableOperation> operation, CancellationToken cancellationToken) { if (entities == null) { throw new ArgumentNullException("entities"); } if (operation == null) { throw new ArgumentNullException("operation"); } IEnumerable <ITableEntity> tableEntities = entities.Select(p => _entityConverter.GetEntity(p)); IEnumerable <TableBatchOperation> batches = _partitioner.GetBatches(tableEntities, operation); IEnumerable <Task> batchExecutionTasks = batches.Select( p => _cloudTable.ExecuteBatchAsync(p, cancellationToken) .Then(results => results.Select( q => _entityConverter.GetEntity((DynamicTableEntity)q.Result)), cancellationToken)); return(Task.Factory.ContinueWhenAll( batchExecutionTasks.ToArray(), tasks => { var result = new List <T>(tasks.Length); foreach (Task task in tasks) { var typedTask = (Task <IEnumerable <T> >)task; result.AddRange(typedTask.Result); } return result.AsEnumerable(); }, cancellationToken)); }
private async Task UpdateConversationModifiedDateForUser(string username, string conversationId, Message message) { ConversationEntity conversationEntity = await RetrieveConversationEntity(username, conversationId); var newOrderedConversationEntity = new OrderedConversationEntity( username, conversationId, conversationEntity.GetParticipants(), message.UtcTime); string oldTicksRowKey = conversationEntity.TicksRowKey; string newTicksRowKey = newOrderedConversationEntity.RowKey; conversationEntity.TicksRowKey = newTicksRowKey; TableBatchOperation batchOperation = new TableBatchOperation { TableOperation.Replace(conversationEntity), // will fail if entity has changed since we retrieved it (ETAG) TableOperation.Delete(new TableEntity(partitionKey: username, rowKey: oldTicksRowKey) { ETag = "*" }), // delete old conversation order entity TableOperation.Insert(newOrderedConversationEntity) // will fail if another entity with the same ticks exists }; try { await table.ExecuteBatchAsync(batchOperation); } catch (StorageException e) { throw new StorageErrorException("Failed to update conversation modified time", e); } }
/// <summary> /// Adds 2 conversation entities for 1 participant in conversation /// </summary> /// <param name="username"></param> /// <param name="recipient"></param> /// <param name="conversation"></param> private async Task AddConversationForUser(string username, string recipient, Conversation conversation) { //Create Entities var entity1Id = new UserConversationsIdRowEntity { PartitionKey = username, RowKey = conversation.Id, LastModifiedUtcTime = conversation.LastModifiedDateUtc, Recipient = recipient }; var entity1Time = new UserConversationsTimeRowEntity { PartitionKey = username, RowKey = ConversationUtils.DateTimeToRowKey(conversation.LastModifiedDateUtc), Recipient = recipient, Id = conversation.Id }; //Define Operations var operation1 = TableOperation.Insert(entity1Id); var operation2 = TableOperation.Insert(entity1Time); //Define Transaction var transaction = new TableBatchOperation { operation1, operation2 }; //Execute Transaction await userConversationsTable.ExecuteBatchAsync(transaction); }