优点与缺点:参数列表中的布尔值指示C#中是否异步

时间:2018-11-14 04:48:48

标签: c# asynchronous task

这是从Azure存储表(官方文档中的examples)中检索的通用方法。

"$(<"$filename")"

我正在参数列表中使用 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"); } } 来指示此方法是否异步。我做到了吗?
优势显而易见:可以轻松在isAsync之间切换选项。
似乎这样的样式也将同步的(async)包装到isAsync = false中,但要付出额外的代价,因为单独执行任务也要花费时间。还有其他缺点吗?

1 个答案:

答案 0 :(得分:4)

我会避免这种情况。简而言之,

  • 应该有很少的实际用例可以保证
  • 这可能会导致死锁
  • 它鼓励您不要使用await进行传播
  • 它会在您的方法中添加更多分支
  • 它在测试时增加了复杂性
  • 通常闻起来很难闻。 (IMO)
  • FCin添加,即使所有呼叫都已同步,它也会生成AsyncStateMachine

注意:即使编写同一方法的async和同步替代方法也是相当可疑的,它难以维护并且可能指向其他设计问题。

如果您真的想等待async方法,请调用者执行,至少可以让他们选择是否需要包装它或适当地处理它