首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么代码分析会在这种方法上触发CA2000?

为什么代码分析会在这种方法上触发CA2000?
EN

Stack Overflow用户
提问于 2016-04-27 05:00:06
回答 2查看 300关注 0票数 4

在此方法中的CA2000变量上生成警告“在失去作用域之前处理对象”( monitor )。

代码语言:javascript
复制
private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    var monitor = new JobMonitor(job, _backend);  // <- CA2000
    try
    {
        var task = monitor.Run(cancellationToken);
        _activeJobs[task] = monitor;
    }
    catch
    {
        monitor.Dispose();
        throw;
    }
}    

我理解CA2000所做的事情,而且我通常能够理解为什么我的代码违反了规则并进行了适当的更改。

然而,在这种情况下,我很困惑--这真的是个假阳性,还是我遗漏了什么?

使用VisualStudio2015EnterpriseEdition,目标为.NET 4.5,使用C# 6。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-27 06:38:50

如果在这里引发异常,您可能会泄漏这个一次性的:

代码语言:javascript
复制
private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    var monitor = new JobMonitor(job, _backend);

    // <- Exception

    try
    {
        var task = monitor.Run(cancellationToken);
        _activeJobs[task] = monitor;
    }
    catch
    {
        monitor.Dispose();
        throw;
    }
}

这可能是由运行时注入线程的ThreadAbortException或任何其他异常引起的。我建议在try块之外声明变量,但在其中分配变量。此外,在成功地将其分配给null时,将其设置为_activeJobs

代码语言:javascript
复制
private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    JobMonitor monitor;

    try
    {
        monitor = new JobMonitor(job, _backend);
        var task = monitor.Run(cancellationToken);
        _activeJobs[task] = monitor;
        monitor = null;
    }
    finally
    {
        if(monitor!=null)
        {
            monitor.Dispose();
        }
        throw;
    }
}

尽管如此,它可能还不足以关闭警告,在这一点上,我建议增加一个抑制它。

票数 2
EN

Stack Overflow用户

发布于 2016-04-27 06:05:04

我假设_activeJobs[task] = monitor;是一个简单的任务,不会抛出异常。如果是这样,则将存储监视器与创建监视器分开。

代码语言:javascript
复制
private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    Task task;
    var monitor = CreateJobMonitor(job, _backend, out task);
    _activeJobs[task] = monitor;
} 

private JobMonitor CreateJobMonitor(IJob job, CancellationToken cancellationToken, out Task task)
{
    var monitor = new JobMonitor(job, _backend);
    try
    {
        task = monitor.Run(cancellationToken);
        return monitor;
    }
    catch
    {
        monitor.Dispose();
        throw;
    }

这样,CreateJobMonitor就意味着返回一个有效的对象或抛出异常。没有机会返回已释放的对象引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36880689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档