Cosmos DB创建表无限期挂起

问题描述 投票:0回答:1

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

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上的演示应用程序的行为相同

azure-cosmosdb azure-table-storage azure-cosmosdb-tables
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.