问题描述
我有一堂课,上面有一些事件。目前,由于他们提出的好处,我决定转向“可观察的”。为了实现此目标,我引入了一个Observable属性,将其替换为事件之一。接下来,我将事件设置为“私有”,以限制类之外的访问。需要时,该事件在类内部使用函数进行调用。但是,我认为这样做可能是更好的方法。正确的做法是什么?顺便说一下,我是“ System.Reactive”的新手,所以如果我对该概念有误解,请澄清此事。我的代码如下:
public class MyClass
{
public MyClass()
{
informationSenderObservable=Observable.FromEventPattern<SolutionEventArg>(ev =>informationSender += ev,ev => informationSender -= ev);
}
private event EventHandler<SolutionEventArg> informationSender;
public IObservable<EventPattern<SolutionEventArg>> informationSenderObservable { get; }
internal void DoSomething()
{
// long calculation
Sendinformation();
}
private void Sendinformation()
{
informationSender?.Invoke(this,new SolutionEventArg()
{
InfoProxyData = GetDetailsForBestCompressedData(),ParallelProcess = parallelProcessing
});
}
}
解决方法
多亏了西奥多·佐里亚斯(Theodor Zoulias),我终于了解到如何更好地处理我的课。我使用ISubject<T>
代替班级中的事件将信息从班级发送到另一个预订ISubject<T>
的班级。
public class MyClass
{
public MyClass()
{
InformationSenderObservable=new Subject<SolutionEventArg>();
}
public ISubject<SolutionEventArg> InformationSenderObservable { get; }
internal void DoSomething()
{
// long calculation
SendInformation();
}
private void SendInformation()
{
try
{
InformationSenderObservable.OnNext(new SolutionEventArg()
{
InfoProxyData = GetDetailsForBestCompressedData(),ParallelProcess = parallelProcessing
});
}
catch (Exception e)
{
InformationSenderObservable.OnError(e);
}
}
}
ISubject<T>
同时实现IObservable<T>
和IObserver<T>
。