0

AzureTable からエンティティのグループを取得しようとしており、次のコードを使用してクエリを実行しています。

string partitionKey = string.Format(CultureInfo.InvariantCulture, "{0:d20}", accountId);
string rowKeyStart = string.Format(CultureInfo.InvariantCulture, "{0}:g", work.lead.id);
string rowKeyEnd = string.Format(CultureInfo.InvariantCulture, "{0}:h", work.lead.id);

var context = table.ServiceClient.GetTableServiceContext();
var query = context.CreateQuery<LinkedInPostEntity>(table.Name)
        .Where(w => w.PartitionKey == partitionKey && w.RowKey.CompareTo(rowKeyStart) > 0 && w.RowKey.CompareTo(rowKeyEnd) <= 0)
        .AsTableServiceQuery(context);

List<PostEntity> postsForLead = new List<PostEntity>();
TableContinuationToken continuation = null;

do
{
    TableQuerySegment<PostEntity> segment = await AzureHelper.QuerySegmented(query, continuation);
    postsForLead.AddRange(segment.Results);
    continuation = segment.ContinuationToken;
} while (continuation != null);

tableは CloudTable のインスタンスでaccountIdあり、int でありwork.lead.id、文字列です。RowKey の前にwork.lead.id:g文字列 ID が続くすべてのエンティティをプルしたいと考えています。このコードは機能するはずですが、QuerySegmented によって指定された処理awaitが終了しないためにハングします。Task

私の考えでは、クエリの形式が正しくない可能性がありますが、その方法や理由はわかりません。

ところで、私は投稿するのが初めてなので、重要な情報を忘れていたり、とにかく明確にするのに役立つ場合はお知らせください.

編集: これは、動作する非常によく似たコードであり、異なる ID スキームを持つ同様の (ただし異なる) テーブルで呼び出されます。使用している api から提供された id スキームを使用する必要があるため、エントリの前に再フォーマットすることはオプションではないと思います。2 つの唯一の違いはクエリであるため、クエリのせいだと感じています。何か案は?

string partitionKey = string.Format(CultureInfo.InvariantCulture, "{0:d20}", accountId);
string rowKeyStart = string.Format(CultureInfo.InvariantCulture, "{0}:{1:d20}", work.ScreenName, (long)0);
string rowKeyEnd = string.Format(CultureInfo.InvariantCulture, "{0}:{1:d20}", work.ScreenName, long.MaxValue);

var context = table.ServiceClient.GetTableServiceContext();
var query = context.CreateQuery<TweetEntity>(table.Name)
        .Where(w => w.PartitionKey == partitionKey && w.RowKey.CompareTo(rowKeyStart) >= 0 && w.RowKey.CompareTo(rowKeyEnd) <= 0)
        .AsTableServiceQuery(context);

List<TweetEntity> tweetsForLead = new List<TweetEntity>();

TableContinuationToken continuation = null;

do
{
    TableQuerySegment<TweetEntity> segment = await AzureHelper.QuerySegmented(query, continuation);
    tweetsForLead.AddRange(segment.Results);
    continuation = segment.ContinuationToken;
} while (continuation != null);
4

1 に答える 1

0

私の感覚では、このメソッドを呼び出してから、返されたタスクに対して、ASP.NET または UI コンテキストから or をWait呼び出していることがわかります。これを行うと、ブログで説明しているように、デッドロックが発生します。Result

于 2013-03-21T19:27:40.010 に答える