private CloudTable Table()
        {
            if (_table == null)
            {
                _creatingTable.WaitOne();
                CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Configuration.StorageAccount);
                CloudTableClient    client         = storageAccount.CreateCloudTableClient();

                var tbl = client.GetTableReference(EntityDefinition.TableName());
                if (tbl.Exists())
                {
                    if (!CheckSchema(tbl))
                    {
                        if (!EntityDefinition.AutoRebuildPartitionIfRequire)
                        {
                            throw new StorageArgumentException("Schema table has changed or not exist");
                        }

                        RebuildPartitions(tbl);
                    }
                }
                else
                {
                    tbl.CreateIfNotExists();
                    WriteSchema(tbl);
                }
                _table = tbl;
                _creatingTable.Set();
            }
            return(_table);
        }
        private async Task <CloudTable> TableAsync()
        {
            if (_table == null)
            {
                if (_creatingTable.WaitOne(TimeoutForStorageResource))
                {
                    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Configuration.StorageAccount);
                    CloudTableClient    client         = storageAccount.CreateCloudTableClient();

                    var tbl = client.GetTableReference(EntityDefinition.TableName());
                    if (await tbl.ExistsAsync().ConfigureAwait(false))
                    {
                        if (!CheckSchema(tbl))
                        {
                            if (!EntityDefinition.AutoRebuildPartitionIfRequire)
                            {
                                throw new StorageArgumentException("Schema table has changed or not exist");
                            }

                            await RebuildPartitionsAsync(tbl).ConfigureAwait(false);
                        }
                    }
                    else
                    {
                        await tbl.CreateIfNotExistsAsync().ConfigureAwait(false);
                        await WriteSchemaAsync(tbl).ConfigureAwait(false);
                    }
                    _table = tbl;
                    _creatingTable.Set();
                }
                else
                {
                    throw new TimeoutException($"Timeout waiting resource {EntityDefinition.TableName()}");
                }
            }
            return(_table);
        }