如何使用Azure的TableClient 2.0 BeginExecuteQuerySegmented如何使用、Azure、TableClient、BeginExecuteQuerySegmente

2023-09-03 01:13:23 作者:你是太阳深拥必伤

我试图让所有条目在我的表异步但我无法弄清楚如何使用延续标记。我怀疑我需要把我的匿名方法并将其转换为一个委托,然后递归与延续标记调用它。

我如何采取以下code,并在新的API执行异步调用,并获取所有条目?

 任务<字符串[]> GetAllTableEntries(CloudTable TBL,字符串[]的网址,字符串名称,的CancellationToken令牌)
    {
        TableRequestOptions reqOptions =新TableRequestOptions(){};
        的OperationContext CTX =新的OperationContext(){ClientRequestID =};
        对象状态= NULL;

        //注册对消令牌
        ICancellableAsyncResult结果= NULL;

        TableQuery QRY =新TableQuery();
        TableContinuationToken TOK = NULL;

        结果= tbl.BeginExecuteQuerySegmented(QRY,TOK,reqOptions,CTX,(0)=>
        {

            VAR响应=(o.AsyncState为CloudTable).EndExecuteQuerySegmented(O);

            Console.WriteLine(发现+ response.Results.Count +记载);

            //下面code的SDK中的previous版本中使用
            //
            // 26://添加数据的第一段
            // 27:pageData.CompletedList.AddRange(
            // 28:从吴response.Results
            // 29:选择新的CompletedWorkUnit(武));
            // 30:
            // 31://继续获取段完成页面
            // 32:而(response.HasMoreResults)
            // 33:{
            // 34:响应= response.GetNext();
            // 35:pageData.CompletedList.AddRange(
            // 36:从吴response.Results
            // 37:选择新的CompletedWorkUnit(武));
            // 38:}
            // 39:
            // 40://设置延续标记为下一个页面请求
            // 41:pageData.ContinuationToken = response.ContinuationToken;
            // 42:evt.Set();

        }, 州);

        //添加取消标记按表客户端2.0重大更改博客条目指导
        token.Register((0)=> result.Cancel(),状态);
 

解决方案

请试试这个:

 静态无效的executeQuery()
    {
        TableContinuationToken令牌= NULL;
        TableRequestOptions reqOptions =新TableRequestOptions(){};
        的OperationContext CTX =新的OperationContext(){ClientRequestID =};
        长totalEntitiesRetrieved = 0;
        而(真)
        {
            CloudTable表= cloudTableClient.GetTableReference(MyTable的);
            TableQuery< TempEntity>查询=(新TableQuery&其中; TempEntity>())。径(100);
            System.Threading.ManualResetEvent EVT =新System.Threading.ManualResetEvent(假);
            VAR的结果= table.BeginExecuteQuerySegmented< TempEntity>(查询,令牌,reqOptions,CTX,(0)=>
            {
                VAR响应=(o.AsyncState为CloudTable).EndExecuteQuerySegmented< TempEntity>(O);
                令牌= response.ContinuationToken;
                INT recordsRetrieved = response.Count();
                totalEntitiesRetrieved + = recordsRetrieved;
                Console.WriteLine(史记检索的这一尝试=+ recordsRetrieved +|总记录检索=+ totalEntitiesRetrieved);
                evt.Set();
            }, 表);
            evt.WaitOne();
            如果(令牌== NULL)
            {
                打破;
            }
        }
    }
 
Windows Azure Table – Simple Approach

一件事我注意到的是,如果我执行它返回一​​个动态表实体的查询,我收到相关的DateTimeOffset错误。这就是为什么我结束了创建一个临时的实体。

希望这有助于。

I'm trying to get all entries in my table asynchronously but am unable to figure out how to work with the continuation token. I suspect I need to take my anonymous method and convert it to a delegate, then recursively call it with the continuation token.

How do I take the following code and perform an Async call and fetch all entries in the new API?

 Task<string[]> GetAllTableEntries(CloudTable tbl, string[] urls, string name, CancellationToken token)
    {
        TableRequestOptions reqOptions = new TableRequestOptions() { };
        OperationContext ctx = new OperationContext() { ClientRequestID = "" };
        object state = null;

        // Register Cancelation Token
        ICancellableAsyncResult result = null;

        TableQuery qry = new TableQuery();
        TableContinuationToken tok = null;

        result = tbl.BeginExecuteQuerySegmented(qry, tok, reqOptions, ctx, (o) =>
        {

            var response = (o.AsyncState as CloudTable).EndExecuteQuerySegmented(o);

            Console.WriteLine("Found " + response.Results.Count + " records");

            // The following code was used in the previous version of the SDK
            //
            //26:                      // add first segment of data
            //27:                      pageData.CompletedList.AddRange(
            //28:                          from wu in response.Results
            //29:                          select new CompletedWorkUnit(wu));
            //30:   
            //31:                      // continue fetching segments to complete page
            //32:                      while (response.HasMoreResults)
            //33:                      {
            //34:                          response = response.GetNext();
            //35:                          pageData.CompletedList.AddRange(
            //36:                              from wu in response.Results
            //37:                              select new CompletedWorkUnit(wu));
            //38:                      }
            //39:   
            //40:                      // set continuation token for next page request
            //41:                      pageData.ContinuationToken = response.ContinuationToken;
            //42:                      evt.Set();

        }, state);

        // Add cancellation token according to guidance from Table Client 2.0 Breaking Changes blog entry
        token.Register((o) => result.Cancel(), state);

解决方案

Please try this:

    static void ExecuteQuery()
    {
        TableContinuationToken token = null;
        TableRequestOptions reqOptions = new TableRequestOptions() { };
        OperationContext ctx = new OperationContext() { ClientRequestID = "" };
        long totalEntitiesRetrieved = 0;
        while (true)
        {
            CloudTable table = cloudTableClient.GetTableReference("MyTable");
            TableQuery<TempEntity> query = (new TableQuery<TempEntity>()).Take(100);
            System.Threading.ManualResetEvent evt = new System.Threading.ManualResetEvent(false);
            var result = table.BeginExecuteQuerySegmented<TempEntity>(query, token, reqOptions, ctx, (o) =>
            {
                var response = (o.AsyncState as CloudTable).EndExecuteQuerySegmented<TempEntity>(o);
                token = response.ContinuationToken;
                int recordsRetrieved = response.Count();
                totalEntitiesRetrieved += recordsRetrieved;
                Console.WriteLine("Records retrieved in this attempt = " + recordsRetrieved + " | Total records retrieved = " + totalEntitiesRetrieved);
                evt.Set();
            }, table);
            evt.WaitOne();
            if (token == null)
            {
                break;
            }
        }
    }

One thing I noticed is that if I execute a query which returns a dynamic table entity, I'm getting an error related to DateTimeOffset. That's why I ended up creating a temporary entity.

Hope this helps.