访问已处置的闭包但没有 using() 块
Access to disposed closure but no using() block
我收到关于
的警告
Access to disposed closure
但我看不出这段代码是如何发生的:
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();
行上发生的警告。
If this warning is correct, how could it happen here?
编译器不知道 Parallel.ForEach
何时以及如何执行传递的委托。可以推断的是,您将一个对象传递给 lambda,这会导致它在闭包中被捕获,因此它会警告您该对象有可能在委托被执行之前被处置,因为它正在被处置在 finally
块中。
在这种特殊情况下,可以取消警告,因为您知道 Parallel.ForEach
将导致立即调用委托。
我收到关于
的警告Access to disposed closure
但我看不出这段代码是如何发生的:
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();
行上发生的警告。
If this warning is correct, how could it happen here?
编译器不知道 Parallel.ForEach
何时以及如何执行传递的委托。可以推断的是,您将一个对象传递给 lambda,这会导致它在闭包中被捕获,因此它会警告您该对象有可能在委托被执行之前被处置,因为它正在被处置在 finally
块中。
在这种特殊情况下,可以取消警告,因为您知道 Parallel.ForEach
将导致立即调用委托。