1

我有一个使用Microsoft.WindowsAzure.StorageClientv1.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;

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

4

2 回答 2

1

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

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

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

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

于 2013-02-08T15:46:16.610 回答
0

您可能需要注意的一些事项:

  1. 诊断连接字符串指向云配置文件中的云存储帐户。
  2. 确保云存储中的表(LastRun)包含一些数据。

您可以做的一件事(或者您可能已经做过)是让应用程序在模拟器中运行实际上是使用云存储帐户而不是存储模拟器。

于 2013-02-07T12:18:32.747 回答