使用Azure存储客户端库2.1,我正在进行表存储异步查询.我创建了这段代码:
public async Task<List<TAzureTableEntity>> GetByPartitionKey(string partitionKey)
{
var theQuery = _table.CreateQuery<TAzureTableEntity>()
.Where(tEnt => tEnt.PartitionKey == partitionKey);
TableQuerySegment<TAzureTableEntity> querySegment = null;
var returnList = new List<TAzureTableEntity>();
while(querySegment == null || querySegment.ContinuationToken != null)
{
querySegment = await theQuery.AsTableQuery()
.ExecuteSegmentedAsync(querySegment != null ?
querySegment.ContinuationToken : null);
returnList.AddRange(querySegment);
}
return returnList;
}
Run Code Online (Sandbox Code Playgroud)
假设有大量数据返回,因此会有很多往返表存储的往返.我遇到的问题是我们正在等待一组数据,将其添加到内存列表中,等待更多数据,将其添加到同一列表中,等待更多数据,将其添加到列表中......等等等等.为什么不围绕常规TableQuery包装Task.Factory.StartNew()?像这样:
public async Task<List<TAzureTableEntity>> GetByPartitionKey(string partitionKey)
{
var returnList = await Task.Factory.StartNew(() =>
table.CreateQuery<TAzureTableEntity>()
.Where(ent => ent.PartitionKey == partitionKey)
.ToList());
return returnList;
}
Run Code Online (Sandbox Code Playgroud)
这样做似乎我们不会来回反复播放SynchronizationContext.或者它真的重要吗?
编辑以改写问题
上面提到的两种情况有什么区别?
在使用.NET 4.5框架和Azure访问控制服务(ACS)的ASP.NET MVC 4应用程序中,我希望为用户提供多种身份验证可能性(即Google,Facebook,Windows Live等).将单个用户与多个身份提供商关联的"最佳做法"是什么?
例如,假设用户有一天登录Google,然后第二天进入另一个浏览器并使用Facebook登录.我怎么知道将Facebook登录与以前的Google登录关联到同一个用户?