获得处置关闭但没有使用()块

时间:2015-12-12 13:47:23

标签: c# warnings dispose parallel.foreach

我收到关于

的警告
  

获得处置关闭

但我不明白这段代码是怎么发生的:

private BlockingCollection<PicInfo> listOfPicInfoObjectBC;
private List<PicInfo> CreatePicInfoObjects(List<string> pics)
{
    listOfPicInfoObjectBC = new BlockingCollection<PicInfo>();
    var cts = new CancellationTokenSource();

    try
    {
        var parallelOptions = new ParallelOptions 
        {
            CancellationToken = cts.Token, 
            MaxDegreeOfParallelism = 10
        };

        Parallel.ForEach(pics, parallelOptions, (pic, loopState) =>
        {
            ParalellizedCreatePicInfoObjects(pic);
            if (!cts.Token.IsCancellationRequested)
                ParalellizedCreatePicInfoObjects(pic);
            else
            {
                loopState.Stop();
                cts.Token.ThrowIfCancellationRequested();
            }

        });
    }

    catch (OperationCanceledException exp)
    {
        .......
    }

    finally
    {
        cts.Dispose();
    }

    return new List<PicInfo>(listOfPicInfoObjectBC);
}

我在其他SO帖子中也看到了这个警告,但他们都必须对using()块做一些事情(这是有道理的)但是我没有。

如果这个警告是正确的,那怎么可能发生呢?

[编辑] 忘记提及此if (!cts.Token.IsCancellationRequested)cts.Token.ThrowIfCancellationRequested();行发出的警告。

1 个答案:

答案 0 :(得分:1)

  

如果这个警告是正确的,那怎么可能发生呢?

编译器不知道<p>何时以及如何执行传递的委托。所有可以推断的是你将一个对象传递给lambda,这会导致它在闭包中被捕获,因此它会警告你,在委托被执行之前有可能会处理该对象,因为它&#39 ;被置于Parallel.ForEach区块内。

在这种特殊情况下,可以禁止警告,因为您知道finally将导致立即调用委托。