作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试异步获取表中的所有条目,但无法弄清楚如何使用 continuation token 。我怀疑我需要采用匿名方法并将其转换为委托(delegate),然后使用继续 token 递归地调用它。
如何使用以下代码执行异步调用并获取新 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);
最佳答案
请尝试这个:
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;
}
}
}
我注意到的一件事是,如果我执行返回动态表实体的查询,我会收到与 DateTimeOffset 相关的错误。这就是为什么我最终创建了一个临时实体。
希望这有帮助。
关于c# - 如何使用 Azure TableClient 2.0 BeginExecuteQuerySegmented,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13426430/
我正在尝试异步获取表中的所有条目,但无法弄清楚如何使用 continuation token 。我怀疑我需要采用匿名方法并将其转换为委托(delegate),然后使用继续 token 递归地调用它。
我是一名优秀的程序员,十分优秀!