コード例 #1
0
        /// <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));
        }
コード例 #2
0
        /// <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));
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        /// <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);
        }