gpt4 book ai didi

c# - 访问Collection时出现A​​rgumentOutOfRangeException,即使索引未超出范围?

转载 作者:行者123 更新时间:2023-12-03 13:21:53 24 4
gpt4 key购买 nike

我有一个应用程序,该应用程序通过一个线程中的一系列图像过滤器处理图像,并在另一个线程中的UI中显示图像。简化的图像过滤器类如下所示:

// This class represents a filter operation on the GPU.
// Process() is repeatedly called by the filter processing thread.
class ShaderFilterBase : IFilter
{
// This variable holds the result of the image operation.
private ImageInfo resultImageInfo;

// Indicates whether the image has been updated by a call to Render()
bool hasChanged = true;

public ICollection<ImageInfo> LastResults
{
get
{
ICollection<ImageInfo> results = new Collection<ImageInfo>();
results.Add(GetEffectResult());
return results;
}
}

public ICollection<ImageInfo> Process(ICollection<ImageInfo> images)
{
// We only process the image if we have exactly one image.
// If more than one image has to be processed by the GPU, this method
// should be overridden in a derived class.
if (images.Count == 1)
{
ImageInfo firstImage = images.First();

// If the supplied image is already a shader resource on the GPU,
// we don't need to upload the texture to the GPU again. We just
// set the output texture of the supplied image to the input texture
// of the current image.
if (firstImage.IsShaderResource)
SetResource(firstImage.ShaderResourceView);
else
UploadInputTexture(firstImage);

Render();

firstImage.ShaderResourceView = OutputShaderResourceView;
}

return images;
}

public virtual void Render()
{
Monitor.Enter(this);

// Perform texture operations on the GPU

hasChanged = true;

Monitor.Exit(this);
}

public ImageInfo GetEffectResult()
{
Monitor.Enter(this);

if (hasChanged)
{
// Download image from GPU and store it in resultImageInfo

hasChanged = false;
}

Monitor.Exit(this);

return resultImageInfo;
}
}

此外,我有各种派生类,这些派生类因要在GPU上执行的HLSL着色器程序而异。图像处理线程遍历那些过滤器实例的集合。仅当需要将图像从视频内存下载到系统内存时,才调用GetEffectResult()。我使用Monitor.Enter(this),因为保证每个过滤器实例在过滤器链中仅存在一次。

为了设置和配置过滤器,我有一个UI,它显示过滤器链中每个过滤器的输出。筛选器实例由筛选器模型封装,由WPF UI使用。

internal abstract class FilterModelBase : DependencyObject
{
private WriteableBitmap preview;

private static readonly DependencyPropertyKey PreviewPropertyKey = DependencyProperty.RegisterReadOnly("Preview",
typeof(ImageSource), typeof(FilterModelBase), new PropertyMetadata());

// The WPF window contains an Image control, which binds to this property.
public static readonly DependencyProperty PreviewProperty = PreviewPropertyKey.DependencyProperty;

public ImageSource Preview
{
get { return (ImageSource)GetValue(PreviewProperty); }
private set { SetValue(PreviewPropertyKey, value); }
}

// The underlying filter.
public IFilter Filter
{
get { return this.filter; }
}

protected FilterModelBase(IEventAggregator eventAggregator, IFilter filter)
{
Check.NotNull(filter, "filter");
this.EventAggregator = eventAggregator;

this.filter = filter;
}

// Updates the filter output preview.
public virtual void Refresh(Dispatcher dispatcher)
{
if (!dispatcher.CheckAccess())
dispatcher.Invoke(new Action(() => Refresh(dispatcher)));
else
{
ImageInfo filterImage = null;

Monitor.Enter(this.filter);

if (this.filter != null && this.filter.LastResults.Count > 0)
filterImage = this.filter.LastResults.ElementAtOrDefault(0);

if (filterImage != null)
{
this.preview.WritePixels(new Int32Rect(0, 0, filterImage.Width, filterImage.Height),
filterImage.ImageBytes, filterImage.Width * filterImage.Channels, 0);
}

Monitor.Exit(this.filter);
}
}

UI线程通过计时器重复调用每个过滤器模型实例的Refresh()方法。

不时地,我在下面的行上收到ArgumentOutOfRangeException:
filterImage = this.filter.LastResults.ElementAtOrDefault(0);

但是,当我检查LastResults属性时,它包含一个元素,就像应该的那样。即使调试器说Collection实际上确实包含一个项目,而我总是访问该集合中的第一个项目,也可能引发ArgumentOutOfRangeException?

最佳答案

引发异常后,由调试器重新评估该属性。元素可能是在Visual Studio暂停调试器的所有操作时由另一个线程插入的。

高温超导

关于c# - 访问Collection时出现A​​rgumentOutOfRangeException,即使索引未超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6478495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com