почему операции Azure для хранения таблиц не выполняются молча?

У меня есть рабочая роль, которую я создал с помощью Microsoft.WindowsAzure.StorageClient v1.7. На моей машине dev и моем эмуляторе вычислений приложение работает нормально. Тем не менее, когда я развертываю 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("LastRun").ToList().OrderByDescending(x => x.RunTime).FirstOrDefault();
Trace.WriteLine("Returning the last result. It ran at: " + lastResult.ToString());
return lastResult;

Никакое исключение не выбрасывается вообще, но я не вижу ни одного из журналов трассировки ниже отмеченного сообщения, и логика моего приложения не выходит за пределы этого метода. Моя локальная конфигурация идентична конфигурации моего облака. Что может вызвать такое поведение?

1
Что значит «операция терпит неудачу»? Не возвращает ли он правильный результат в переменной lastResult? Что вы видите в журналах трассировки?
добавлено автор Gaurav Mantri, источник
@GauravMantri: добавлены некоторые подробности наблюдений после блока кода. Это помогает?
добавлено автор TSL, источник

2 ответы

Мои психические способности отладки говорят мне, что это не терпит неудачу - это займет очень много времени. Вызов .ToList() будет пытаться извлечь каждый объект в таблице. Возможно, в вашей таблице хранилищ dev имеется не так много строк (несколько тысяч?), В то время как в производстве гораздо больше. Так что это займет гораздо больше времени. Я думаю, вы также будете пытаться вставить все эти объекты в память, что также может привести к замедлению, если вы начнете использовать файл страницы.

Вы можете проверить эту гипотезу, добавив в запрос Take (1000) . Очевидно, что это не даст вам правильного ответа, вы просто хотите узнать, завершает ли он. Мои навыки v1.7 немного ржавые, но я думаю, что это будет выглядеть так:

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

Если ограниченный запрос завершается успешно, то фактическое решение - это выяснить, как быстро выполнить этот запрос. Вам нужно будет добавить какое-либо условие к запросу, которое уменьшит размер результатов, возвращающихся из хранилища таблиц, или, возможно, индексирует ваши данные по-другому (например, включить RunTime в RowKey).

1
добавлено

Некоторые из вещей, которые вы, возможно, захотите посмотреть:

  1. Строка подключения диагностики указывает на учетную запись облачного хранилища в вашем конфигурационном файле облака.
  2. Убедитесь, что таблица (LastRun) в облачном хранилище содержит некоторые данные.

Одна вещь, которую вы могли бы сделать (или, возможно, вы уже это сделали), - это приложение, запущенное в эмуляторе, фактически использует учетную запись облачного хранилища вместо эмулятора хранилища.

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot