资产 | 价值 |
---|---|
规则 ID | CA2025 |
标题 | 不要将“IDisposable”实例传递到未唤醒的任务中 |
类别 | 可靠性 |
修复是中断修复还是非中断修复 | 非中断 |
默认情况下,在 .NET 10 中启用 |
否 |
原因
IDisposable
实例将传递到未唤醒的任务中,并在任务使用实例完成之前释放该任务。
规则说明
使用 IDisposable
实例的未唤醒任务在释放后不久可能会使用这些实例。 确保使用这些实例的任务在实例被处置之前完成。
例子
以下代码片段(及其 Visual Basic 等效项)违反了 CA2025:
public Task DoSomethingAsync()
{
// Using statements and using blocks can both be violations.
using (var disposable = new DisposableThing())
{
return DoSomethingInternalAsync(disposable);
}
}
public async Task DoThingsAsync()
{
var disposable = new DisposableThing();
var task = DoSomethingInternalAsync(disposable);
// More code here.
dispose.Dispose();
// It's a violation if arguments are disposed before the task is awaited.
await task.ConfigureAwait(false);
}
何时禁止显示警告
如果知道任务在释放之前已完成使用 IDisposable
实例,请禁止显示这些警告。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable CA2025
// The code that's violating the rule is on this line.
#pragma warning restore CA2025
若要禁用文件、文件夹或项目的规则,请在none
中将其严重性设置为。
[*.{cs,vb}]
dotnet_diagnostic.CA2025.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。