异常消息不是很有帮助,但这里是
'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 事件模式。