0

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

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并明确等待异步表单返回的任务。

注意与https://github.com/Azure-Samples/azure-cosmos-table-dotnet-core-getting-started.git 上的演示应用程序的行为相同

4

1 回答 1

0

永远不要使用.Wait()(或.Result),特别是如果它来自 UI 线程(或控制器方法),因为它可能导致死锁。

将您的方法更改为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;
}
于 2019-04-04T12:37:01.123 回答