C#.NET 中的反应式扩展随机抛出"System.Security.VerificationException"



异常消息不是很有帮助,但这里是

'observableTeamMember.AssignedTaskEvents.Added' 抛出了一个异常 类型"系统.安全.验证异常"

Method System.Reactive.Linq.Observable.FromEventPattern: type 参数 'Bourne.iClean.Planning.Observables.NotifyChildAddedEventArgs'1[T]' 违反了类型参数"TEventArgs"的约束。

为了给您一个简短的概述,我们有一个C#.NET Windows服务托管的服务器端,它处理来自Web应用程序的请求。该服务查询一个"计划模型",该模型是所有数据对象的缓存版本,我们维护此缓存以加快对前端查询的响应。

我们使用反应式扩展来使数据缓存在发生某些事件(如数据对象的更新)时保持最新。数据缓存中的某些对象具有子事件订阅,当这些子对象中的任何一个发生更改时,我们会更新缓存,例如 - 我们有一个 TeamMemberObject,如下所示,其中包含一些与之关联的子事件

 public interface IObservableTeamMember : IObservableEntity<TeamMember>
{
    ChildEvents<TeamCalendar> TeamCalendarEvents {get;}
    ChildEvents<AssignedTaskTeamMember> AssignedTaskEvents { get; }
    ChildEvents<WorkplaceAssignedTaskTeamMember> WorkplaceAssignedTaskEvents { get; }
}

每当更新这些子事件/对象中的任何一个时,我们都会使用以下代码更新缓存。下面的块,我得到安全异常

observableTeamMember.AssignedTaskEvents.Added.Subscribe((NotifyChildAddedEventArgs<AssignedTaskTeamMember> e) =>
        {
            this._addAssignedTaskEntry(e.AddedChild);
        });

我还在下面包含子事件类的部分代码

public class ChildEvents<T> : IChildEvents<T>
{
    public void Add(T child)
    {
        var args = new NotifyChildAddedEventArgs<T>(child);
        _raiseChildAdded(args);
    }
    public void Remove(T child)
    {
        var args = new NotifyChildDeletedEventArgs<T>(child);
        _raiseChildDeleted(args);
    }
    event NotifyChildAddedEventHandler<T> _baseTAdded;
    protected void _raiseChildAdded(NotifyChildAddedEventArgs<T> args)
    {
        var childAdded = _baseTAdded;
        if (childAdded != null)
            childAdded(this, args);
    }
    private IObservable<NotifyChildAddedEventArgs<T>> _childAdded;
    public IObservable<NotifyChildAddedEventArgs<T>> Added
    {
        get
        {
            if (_childAdded == null)
                _childAdded = Observable.FromEventPattern<NotifyChildAddedEventHandler<T>, NotifyChildAddedEventArgs<T>>(
                    (handler) => _baseTAdded += handler,
                    (handler) => _baseTAdded -= handler)
                    .Select(e => e.EventArgs);
            return _childAdded;
        }
    }
}  

这种例外只是偶尔发生,我们是一个 3 人的团队,它在某个时候随机发生在我们所有人身上。我们在整个项目中使用反应式扩展,我们无法解释原因。任何帮助将不胜感激。

谢谢塔帕夏

该错误表明您的Bourne.iClean.Planning.Observables.NotifyChildAddedEventArgs<T>不继承自System.EventArgs,这是Observable.FromEventPattern所必需的,因为它特别希望您确认标准 .NET 事件模式。

相关内容

  • 没有找到相关文章

最新更新