c# - 如何在 C# 和 System.Reactive 中将基于事件的类替换为基于可观察的类?
问题描述
我有一堂课,里面有一些活动。目前,我决定转向“Observables”,因为它们提出了好处。为了达到这个目标,我引入了一个 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>
。
推荐阅读
- javascript - 滚动时仅触发一次 onwheel 侦听器
- azure - 将iothub消息分发到所有分区
- vue.js - 安装 Vuejs 时遇到问题
- python - Marshmallow:如何将字典或对象序列化为 XML?
- javascript - 在 javascript 中访问 JSON 并在控制台中打印它
- sql - 如何选择列等于另一列的另一种类型的值
- python - 在 pyplot.table 中插入图像/对象
- bootstrap-4 - 什么 Quasar 可以做 Bootstarp+Vuejs 做不到的?
- java - ImageView 不显示图像 - JavaFX
- vba - 刷新搜索结果