我正在使用新的WindowsAzure.Storage 2.0(可能不是一个令人信服的信息),我正在使用CloudTableClient实现数据访问.我见过的大多数样本都是在ASP MVC控制器的存储器中实现CloudTableClient(根据Web请求实例化).这样做有任何性能损失吗?将长时间运行的实例保持为单例样式是否明智?
对于我的内心运作方式,我有些不清楚TaskCompletionSource<>.
当Task<>使用the 创建一个简单的时候Factory,我希望这个任务在一个线程池中排队,除非我指定TaskCreationOptions.LongRunning,它将在一个新的线程中运行.
我的理解TaskCompletionSource是,我负责在任务结束或失败时触发,并且我完全控制如何管理线程.然而,ctor TaskCompletionSource允许我指定一个TaskCreationOptions,这让我感到困惑,因为我期望Scheduler无法处理任务本身.
TaskCreationOptions在一个上下文中的目的是TaskCompletionSource<>什么?
这是一个使用示例:
public Task<WebResponse> Download(string url)
{
TaskCompletionSource<WebResponse> tcs =
new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
var client = (HttpWebRequest)HttpWebRequest.Create(url);
var async = client.BeginGetResponse(o =>
{
try
{
WebResponse resp = client.EndGetResponse(o);
tcs.SetResult(resp);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
}, null);
return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud) 这是一段初始化TableBatchOperation的代码,用于在一个批处理中检索两行:
TableBatchOperation batch = new TableBatchOperation();
batch.Add(TableOperation.Retrieve("somePartition", "rowKey1"));
batch.Add(TableOperation.Retrieve("somePartition", "rowKey2"));
//second call throws an ArgumentException:
//"A batch transaction with a retrieve operation cannot contain
//any other operation"
Run Code Online (Sandbox Code Playgroud)
如上所述,抛出异常,并且似乎不支持在单个批处理中检索N行.这对我来说很重要,因为我需要为每个请求检索大约50行.这个问题与成本明智一样具有性能.您可能知道,Azure表存储定价基于事务量,这意味着50个检索操作比单个批处理操作贵50倍.
我错过了什么吗?
旁注 我正在使用新的Azure Storage api 2.0.我注意到这个问题从未在网上提出过.最近可能添加了这个约束吗?
编辑
我在这里找到了一个相关的问题:PartitionKey/RowKey列表上的Azure表存储查询非常慢.似乎在rowkeys上使用带有"或"的TableQuery会产生全表扫描.这里真的有一个严重的问题......
执行批处理时,如果TableBatchOperation的其中一个操作失败:
我们正在开发一个面向服务的大型多层应用程序,必须从头开始设计.现在我们需要开始编程,并尝试组装第一块砖.
问题是从哪里开始?有人建议我们应该从设计持久数据模型开始,这将提供更清晰的视图.这是一个好方法吗?
编辑为Suirtimed
这里没有太多的敏捷文化.这是一个SOA样式项目,使用WCF,SQL Server,实体框架(使用POCO生成器用于域对象),ASP MVC和Workflow Foundation.我们是一个由4名开发人员组成的团队; 技术合理(但不是专家).
architecture database-design design-patterns software-design