升级Roslyn Analyzers到6.0后await using报CA2007如何解决?
问题本质
IAsyncDisposable调用ConfigureAwait(false)后返回的是ConfiguredAsyncDisposable结构体,而非原对象本身,直接赋值的话自然会丢失原MemoryStream类型。你可以通过拆分变量声明和释放配置的方式实现需求,以下是两种通用可行方案:
方案1:块式await using(作用域清晰,推荐)
先单独声明并初始化MemoryStream变量,再将其传入await using的配置逻辑中:
var memoryStream = new MemoryStream(fileByteArray); await using (memoryStream.ConfigureAwait(false)) { // 块内可正常访问memoryStream,类型保持为MemoryStream // 你的业务逻辑 }
该方案的释放作用域完全由大括号控制,逻辑清晰不易出错。
方案2:无额外缩进的声明式写法
如果你不想增加额外的大括号缩进,可以用丢弃变量接收ConfigureAwait的返回值:
var memoryStream = new MemoryStream(fileByteArray); await using var _ = memoryStream.ConfigureAwait(false); // 后续可正常使用memoryStream,类型保持为MemoryStream
该方案的memoryStream释放作用域和直接写await using var声明的效果完全一致,会在当前方法执行结束时自动触发带ConfigureAwait(false)配置的异步释放。
两种方案均不需要屏蔽告警,完全符合CA2007的修复规则。
内容的提问来源于stack exchange,提问作者Ken Brannigan
相关产品推荐
相关产品推荐

