Azure存储表异步删除方法:Task与Async的正确实现方式
关于Azure Storage Account表操作异步方法重载的写法确认
我正在编写一个操作Azure Storage Account表的简易类库,想要实现异步功能,但不确定当前的写法是否正确。第一个重载方法仅调用第二个方法,我担心这种写法会在已有Task内创建嵌套Task,之前用这种方式时部分应用出现了异常。
现有实现代码:
public async Task<Response> DeleteEntityAsync(ITableEntity entity) { return await DeleteEntityAsync(entity.PartitionKey, entity.RowKey); } public async Task<Response> DeleteEntityAsync(string partitionKey, string rowKey) { var delEntity = await TableClient.DeleteEntityAsync(partitionKey, rowKey); WriteLog($"Deleted entity: 'PK:{partitionKey}' 'RK:{rowKey}' T:'{_tableName}'."); return delEntity; }
想确认第一个方法是否应改为以下写法:
public Task<Response> DeleteEntityAsync(ITableEntity entity) { return DeleteEntityAsync(entity.PartitionKey, entity.RowKey); }
解答
第二种写法是更优的选择,原因如下:
- 第一种写法用
async/await包裹对重载方法的调用,编译器会生成额外的异步状态机,虽然功能上完全正确,但会带来不必要的性能开销,同时确实会生成一个包装了内部Task的外层Task(也就是你担心的嵌套Task)。 - 第二种写法直接返回内部异步方法的Task,完全避免了额外状态机的生成,性能更高效,也不存在嵌套Task的问题。调用方拿到的就是底层操作的真实Task,后续的
await操作可以正常处理整个异步流程。
补充说明:第一种写法本身不会直接导致异常,你之前遇到的应用异常大概率是其他场景的问题,但这种“冗余async/await”的写法没有存在的必要,推荐使用直接返回Task的实现方式。
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

