public static async Task WriteBatchAsync()

in src/Microsoft.Azure.WebJobs.Logging/Internal/Utility.cs [215:269]


        public static async Task WriteBatchAsync<T>(this ILogTableProvider logTableProvider, IEnumerable<T> e1) where T : TableEntity, IEntityWithEpoch
        {
            HashSet<string> rowKeys = new HashSet<string>();

            int batchSize = 90;

            // Batches must be within a single table partition, so Key is "tableName + ParitionKey". 
            var batches = new Dictionary<string, Tuple<CloudTable, TableBatchOperation>>();

            List<Task> t = new List<Task>();

            foreach (var e in e1)
            {
                if (!rowKeys.Add(e.RowKey))
                {
                    // Already present
                }

                var epoch = e.GetEpoch();
                var instanceTable = logTableProvider.GetTableForDateTime(epoch);

                string key = instanceTable.Name + "/" + e.PartitionKey;
                                
                Tuple<CloudTable, TableBatchOperation> tuple;
                if (!batches.TryGetValue(key, out tuple))
                {
                    tuple = Tuple.Create(instanceTable, new TableBatchOperation());
                    batches[key] = tuple;
                }
                TableBatchOperation batch = tuple.Item2;

                batch.InsertOrMerge(e);
                if (batch.Count >= batchSize)
                {
                    Task tUpload = instanceTable.SafeExecuteAsync(batch);
                    t.Add(tUpload);

                    batches.Remove(key);
                }
            }

            // Flush remaining
            foreach (var tuple in batches.Values)
            {
                var instanceTable = tuple.Item1;
                var batch = tuple.Item2;
                if (batch.Count > 0)
                {
                    Task tUpload = instanceTable.SafeExecuteAsync(batch);
                    t.Add(tUpload);
                }
            }

            await Task.WhenAll(t);
        }