c# - 为什么 Azure 表存储操作会默默失败?

标签 c# azure azure-table-storage

我有一个使用 Microsoft.WindowsAzure.StorageClient v1.7 构建的辅助角色。在我的开发机器上,使用我的计算模拟器,该应用程序运行良好。但是,当我部署到 Azure 时,表存储操作会默默失败。代码如下 - BackupResult 类继承自 TableServiceEntity:

Trace.WriteLine("Entering cloud storage method");
CloudTableClient client = storageAccount.CreateCloudTableClient();
Trace.WriteLine("Got the client..."); // Last message received.
client.CreateTableIfNotExist("LastRun");
Trace.WriteLine("Created the table (maybe)...");
TableServiceContext context = client.GetDataServiceContext();
Trace.WriteLine("Got the context...");
BackupResult lastResult = context.CreateQuery<BackupResult>("LastRun").ToList().OrderByDescending(x => x.RunTime).FirstOrDefault();
Trace.WriteLine("Returning the last result. It ran at: " + lastResult.ToString());
return lastResult;

根本没有抛出任何异常,但我没有在标记消息下方看到任何跟踪日志,并且我的应用程序的逻辑不会在此方法之外继续进行。我的本地配置与我的云配置相同。什么会导致这种行为?

最佳答案

我的心灵调试能力告诉我,这并没有失败——只是花了很长时间。 .ToList() 调用将尝试检索表中的每个实体。您的开发存储表可能没有太多行(几千?),而生产存储表则有更多行。所以这需要更长的时间。我认为您还会尝试将所有这些实体保留在内存中,如果您开始使用页面文件,这也可能会导致速度减慢。

您可以通过向查询添加 Take(1000) 来测试这个假设。显然这不会给你正确的答案,你只是想看看它是否完成。我的 v1.7 技能有点生疏,但我想应该是这样的:

BackupResult lastResult = context.CreateQuery<BackupResult>("LastRun")
.Take(1000) //BEFORE the .ToList() - very important!
.ToList() 
.OrderByDescending(x => x.RunTime) 
.FirstOrDefault(); 

如果有限查询确实成功完成,那么实际的解决方案是找出如何快速执行该查询。您要么需要向查询添加一些条件,以减少从表存储返回的结果的大小,要么可能以不同的方式索引数据(例如,将 RunTime 合并到 RowKey 中)。

关于c# - 为什么 Azure 表存储操作会默默失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14750158/

相关文章:

c# - 列表框项目WPF,不同项目的不同背景颜色

c# - C# 中的按位 "~"运算符

Azure表: how to manage class versions

c# - Azure表: Retrieve entire table

azure - 查询 Azure 存储表是否始终是 1 个事务?

C# 如何导出位于祖父文件夹中的文件的相对文件路径?

c# - 非赋值类的调用方法

azure - 如何根据消息类型将事件中心消息路由到不同的 Azure 函数

c# - Azure 函数从 Azure 表存储检索行

azure - 使用 Azure 搜索字段的 DocumentDB 查询