CA2025:不要将“IDisposable”实例传递到未唤醒的任务中

资产 价值
规则 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

有关详细信息,请参阅如何禁止显示代码分析警告