首页 > 解决方案 > 如何在 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
            });
    }
}

标签: c#eventsdesign-patternsobservablesystem.reactive

解决方案


多亏了 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>


推荐阅读