1

Microsoft.WindowsAzure.StorageClientv1.7で作成した worker ロールがあります。私の開発マシンと計算エミュレーターでは、アプリケーションは正常に動作します。ただし、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)ます。明らかにそれはあなたに正しい答えを与えません、あなたはそれが完了するかどうかを見たいだけです。私の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)にデータが含まれていることを確認します。

あなたができることの1つ(またはあなたがすでにそれをしているかもしれない)は、エミュレーターで実行されているアプリケーションが実際にストレージエミュレーターの代わりにクラウドストレージアカウントを使用していることです。

于 2013-02-07T12:18:32.747 に答える