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

问题描述

| 我有一个应用程序,该应用程序通过一个线程中的一系列图像过滤器处理图像,并在另一个线程中的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,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暂停调试器的所有操作时由另一个线程插入的。 高温超导     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...