CosmosDB创建表不确定地挂起

时间:2019-04-04 12:33:04

标签: azure-cosmosdb azure-table-storage azure-cosmosdb-tables

我尝试了创建表的方法的所有四种变体:

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 :(得分:0)

从未使用过.Wait()(或.Result),特别是如果它来自UI线程(或Controller方法),因为它可能导致死锁。

将方法更改为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;
}