在此方法中的CA2000变量上生成警告“在失去作用域之前处理对象”( monitor )。
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。
发布于 2016-04-27 06:38:50
如果在这里引发异常,您可能会泄漏这个一次性的:
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。
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;
}
}尽管如此,它可能还不足以关闭警告,在这一点上,我建议增加一个抑制它。
发布于 2016-04-27 06:05:04
我假设_activeJobs[task] = monitor;是一个简单的任务,不会抛出异常。如果是这样,则将存储监视器与创建监视器分开。
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就意味着返回一个有效的对象或抛出异常。没有机会返回已释放的对象引用。
https://stackoverflow.com/questions/36880689
复制相似问题