C# 优点与缺点:参数列表中的bool值在C中表示异步或非异步#
下面是从Azure存储表(在官方文档中)检索的通用方法C# 优点与缺点:参数列表中的bool值在C中表示异步或非异步#,c#,asynchronous,task,C#,Asynchronous,Task,下面是从Azure存储表(在官方文档中)检索的通用方法 public async Task RetrieveOne(string partitionKey,string rowKey,bool isAsync=false),其中T:TableEntity { //来构造查询操作 TableOperation retrieveOperation=TableOperation.Retrieve(partitionKey,rowKey); //执行查询 表格结果; 如果(isAsync) { 结果=等
public async Task RetrieveOne(string partitionKey,string rowKey,bool isAsync=false),其中T:TableEntity
{
//来构造查询操作
TableOperation retrieveOperation=TableOperation.Retrieve(partitionKey,rowKey);
//执行查询
表格结果;
如果(isAsync)
{
结果=等待_table.ExecuteAsync(检索操作);
}
其他的
{
结果=_table.Execute(retrieveOperation);
}
//解析结果
如果(result.result!=null)
{
返回(T)result.result;
}
其他的
{
抛出新异常(“检索到的结果为空”);
}
}
我在参数列表中使用isAsync
,以指示此方法是否异步。我成功了吗优点显而易见:可以轻松地在
async
与否之间切换选项这样的风格似乎也会将同步的(
isAsync=false
)包装成一个任务
,代价是额外的成本,因为单独踢出任务也会花费时间。还有其他缺点吗?我会避免这一点。。总之,
- 应该很少有真实世界的用例可以证明这一点
- 这可能会造成僵局
- 它鼓励您不要使用
和传播等待
- 它在方法中添加了更多分支
- 它增加了测试的复杂性
- 它通常闻起来很难闻。(海事组织)
- 通过添加,它还将生成AsyncStateMachine,即使所有调用都是同步的
async
和synchronous替代方案也是相当可疑的,它更难维护,并且可能指向其他设计问题
如果你真的想等待一个
async
方法,就让调用者去做吧,这至少让调用者可以选择在需要时包装它,或者以其他方式适当地处理它我会避免这一点。。总之,
- 应该很少有真实世界的用例可以证明这一点
- 这可能会造成僵局
- 它鼓励您不要使用
和传播等待
- 它在方法中添加了更多分支
- 它增加了测试的复杂性
- 它通常闻起来很难闻。(海事组织)
- 通过添加,它还将生成AsyncStateMachine,即使所有调用都是同步的
async
和synchronous替代方案也是相当可疑的,它更难维护,并且可能指向其他设计问题
如果你真的想等待一个
async
方法,让调用者去做,这至少让调用者可以选择在需要时包装它,或者以其他方式适当地处理它你在网络框架中观察到这样的事情了吗?或者您是否看到类似于LoadData()
和LoadDataAsync
?@不满1070452我刚刚编辑了我的问题。请参考添加的示例以供参考。在async=false
中,您将无法使用结果,因为它不会等待执行。您是否在NET framework中观察到此类情况?或者您是否看到类似于LoadData()
和LoadDataAsync
?@不满1070452我刚刚编辑了我的问题。请参考添加的示例以供参考。在async=false
中,您将无法使用结果,因为它不会等待执行。即使所有调用都是同步的,它也将生成AsyncStateMachine即使所有调用都是同步的,它也将生成AsyncStateMachine
public async Task<T> RetrieveOne<T>(string partitionKey, string rowKey, bool isAsync = false) where T : TableEntity
{
// To construct the query operation
TableOperation retrieveOperation = TableOperation.Retrieve<T>(partitionKey, rowKey);
// To execute the query
TableResult result;
if (isAsync)
{
result = await _table.ExecuteAsync(retrieveOperation);
}
else
{
result = _table.Execute(retrieveOperation);
}
// To parse the result
if (result.Result != null)
{
return (T)result.Result;
}
else
{
throw new Exception("The result retrieved is null");
}
}