CosmosDB Create Table висит бесконечно - PullRequest
0 голосов
/ 04 апреля 2019

Я испробовал все четыре варианта методов создания таблицы:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

var tableClient = storageAccount.CreateCloudTableClient();
var table = tableClient.GetTableReference("test");
var task = table.CreateIfNotExistsAsync();
task.Wait();
return table;

Проводник хранилища Azure создал таблицу без каких-либо задержек.

Нет тайм-аута или другого исключения, просто виснет.

Есть идеи?Я изо всех сил пытаюсь придумать, как его отладить.

Я пробовал это в приложении ASP.NET и в консольном приложении.Я пробовал асинхронные и синхронизирующие формы методов.Я попытался использовать async / await и явно ожидать возвращенную задачу от асинхронных форм.

NB То же поведение с демонстрационными приложениями на https://github.com/Azure-Samples/azure-cosmos-table-dotnet-core-getting-started.git

1 Ответ

0 голосов
/ 04 апреля 2019

Никогда не использовал .Wait() (или .Result), особенно если это происходит из потока пользовательского интерфейса (или метода контроллера), так как это может привести к взаимоблокировке.

Измените свой метод на async Task<T>.

Пример:

public async Task<Table> CreateTableIfNotExistsAsync()
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

    var tableClient = storageAccount.CreateCloudTableClient();
    var table = tableClient.GetTableReference("test");
    await table.CreateIfNotExistsAsync();
    return table;
}

Если нет способа превратить это в асинхронный код, тогда вы можете попробовать ConfigureAwait(false), но это будет работать, только если все, что вызывает этот метод и любой метод, который он вызывает, также использует его.

public Table CreateTableIfNotExists()
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

    var tableClient = storageAccount.CreateCloudTableClient();
    var table = tableClient.GetTableReference("test");
    table.CreateIfNotExistsAsync().ConfigureAwait(false).GetAwaiter().GetResult();
    return table;
}
...