我试图让所有条目在我的表异步但我无法弄清楚如何使用延续标记。我怀疑我需要把我的匿名方法并将其转换为一个委托,然后递归与延续标记调用它。
我如何采取以下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)
{
打破;
}
}
}
一件事我注意到的是,如果我执行它返回一个动态表实体的查询,我收到相关的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.