C# 优点与缺点:参数列表中的bool值在C中表示异步或非异步#

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) { 结果=等

下面是从Azure存储表(在官方文档中)检索的通用方法

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");
        }
    }