Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Rx如何从发布/订阅模式创建序列_C#_.net_System.reactive_Publish Subscribe_Producer Consumer - Fatal编程技术网

C# Rx如何从发布/订阅模式创建序列

C# Rx如何从发布/订阅模式创建序列,c#,.net,system.reactive,publish-subscribe,producer-consumer,C#,.net,System.reactive,Publish Subscribe,Producer Consumer,我尝试使用Rx从发布/订阅模式(即经典的观察者模式,其中下一个元素由生产者发布)创建一个序列。这与.net事件基本相同,只是我们需要对其进行概括,这样就不需要有事件,因此我无法利用Observable.FromEvent。我一直在玩Observable.Create和Observable.Generate,发现自己最终不得不编写代码来处理发布/订阅(也就是说,我必须编写生产者/消费者代码来隐藏发布的项目,然后通过调用IObserver.OnNext()来使用它),所以看起来我并没有真正利用Rx

我尝试使用Rx从发布/订阅模式(即经典的观察者模式,其中下一个元素由生产者发布)创建一个序列。这与.net事件基本相同,只是我们需要对其进行概括,这样就不需要有事件,因此我无法利用Observable.FromEvent。我一直在玩Observable.Create和Observable.Generate,发现自己最终不得不编写代码来处理发布/订阅(也就是说,我必须编写生产者/消费者代码来隐藏发布的项目,然后通过调用IObserver.OnNext()来使用它),所以看起来我并没有真正利用Rx

我是在寻找正确的路径,还是这很适合Rx


谢谢

您的发布者只是将一些
IObservables
公开为属性。而您的消费者只需向他们订阅(或者在订阅之前做他们想要的任何事情)

有时,这就像在出版商中使用
主题一样简单。有时它更复杂,因为您的发布者实际上正在观察其他一些可观察的过程

下面是一个愚蠢的例子:

public class Publisher
{
    private readonly Subject<Foo> _topic1;

    /// <summary>Observe Foo values on this topic</summary>
    public IObservable<Foo> FooTopic
    {
       get { return _topic1.AsObservable(); }
    }

    private readonly IObservable<long> _topic2;

    /// <summary>Observe the current time whenever our clock ticks</summary>
    public IObservable<DateTime> ClockTickTopic
    {
        get { return _topic2.Select(t => DateTime.Now); }
    }

    public Publisher()
    {
         _topic1 = new Subject<Foo>();
         // tick once each second
         _topic2 = Observable.Interval(TimeSpan.FromSeconds(1));
    }

    /// <summary>Let everyone know about the new Foo</summary>
    public NewFoo(Foo foo) { _topic1.OnNext(foo); }
}


// interested code...
Publisher p = ...;
p.FooTopic.Subscribe(foo => ...);

p.ClickTickTopic.Subscribe(currentTime => ...);

// count how many foos occur during each clock tick
p.FooTopic.Buffer(p.ClockTickTopic)
    .Subscribe(foos => Console.WriteLine("{0} foos during this interval", foos.Count));
公共类发布程序
{
私人只读主题_主题1;
///注意本主题中的Foo值
公共IObservable FooTopic
{
获取{return_topic1.AsObservable();}
}
私有只读IObservable _topic2;
///每当我们的时钟滴答作响时,请观察当前时间
公共IObservable主题
{
获取{return}topic2.Select(t=>DateTime.Now);}
}
公共出版商()
{
_主题1=新主题();
//每秒钟打一次勾
_topic2=可观察的时间间隔(时间跨度从秒开始(1));
}
///让每个人都知道新的Foo
公共新闻网(Foo-Foo){u-topic1.OnNext(Foo);}
}
//感兴趣的代码。。。
出版商p=。。。;
p、 FooTopic.Subscribe(foo=>…);
p、 单击勾选主题。订阅(currentTime=>…);
//计算每个时钟周期内发生的FOO数
p、 FooTopic.Buffer(p.clocktick主题)
.Subscribe(foos=>Console.WriteLine(“{0}foos在此间隔内”,foos.Count));

您的发布者只是将一些
iobservable
作为属性公开。而您的消费者只需向他们订阅(或者在订阅之前做他们想要的任何事情)

有时,这就像在出版商中使用
主题一样简单。有时它更复杂,因为您的发布者实际上正在观察其他一些可观察的过程

下面是一个愚蠢的例子:

public class Publisher
{
    private readonly Subject<Foo> _topic1;

    /// <summary>Observe Foo values on this topic</summary>
    public IObservable<Foo> FooTopic
    {
       get { return _topic1.AsObservable(); }
    }

    private readonly IObservable<long> _topic2;

    /// <summary>Observe the current time whenever our clock ticks</summary>
    public IObservable<DateTime> ClockTickTopic
    {
        get { return _topic2.Select(t => DateTime.Now); }
    }

    public Publisher()
    {
         _topic1 = new Subject<Foo>();
         // tick once each second
         _topic2 = Observable.Interval(TimeSpan.FromSeconds(1));
    }

    /// <summary>Let everyone know about the new Foo</summary>
    public NewFoo(Foo foo) { _topic1.OnNext(foo); }
}


// interested code...
Publisher p = ...;
p.FooTopic.Subscribe(foo => ...);

p.ClickTickTopic.Subscribe(currentTime => ...);

// count how many foos occur during each clock tick
p.FooTopic.Buffer(p.ClockTickTopic)
    .Subscribe(foos => Console.WriteLine("{0} foos during this interval", foos.Count));
公共类发布程序
{
私人只读主题_主题1;
///注意本主题中的Foo值
公共IObservable FooTopic
{
获取{return_topic1.AsObservable();}
}
私有只读IObservable _topic2;
///每当我们的时钟滴答作响时,请观察当前时间
公共IObservable主题
{
获取{return}topic2.Select(t=>DateTime.Now);}
}
公共出版商()
{
_主题1=新主题();
//每秒钟打一次勾
_topic2=可观察的时间间隔(时间跨度从秒开始(1));
}
///让每个人都知道新的Foo
公共新闻网(Foo-Foo){u-topic1.OnNext(Foo);}
}
//感兴趣的代码。。。
出版商p=。。。;
p、 FooTopic.Subscribe(foo=>…);
p、 单击勾选主题。订阅(currentTime=>…);
//计算每个时钟周期内发生的FOO数
p、 FooTopic.Buffer(p.clocktick主题)
.Subscribe(foos=>Console.WriteLine(“{0}foos在此间隔内”,foos.Count));

使用RX绝对适合发布/订阅。下面是一个演示,演示了使用
IObservable
和RX的最简单的发布/订阅模式

使用NuGet将被动扩展(RX)添加到您的项目中,搜索
RX main
,然后安装
Reactive Extensions-main Library

using System;
using System.Reactive.Subjects;

namespace RX_2
{
    public static class Program
    {
        static void Main(string[] args)
        {
            Subject<int> stream = new Subject<int>();

            stream.Subscribe(
                o =>
                {
                    Console.Write(o);
                });

            stream.Subscribe(
                o =>
                {
                    Console.Write(o);
                });

            for (int i = 0; i < 5; i++)
            {
                stream.OnNext(i);
            }

            Console.ReadKey();
        }
    }
}

使用RX绝对适合发布/订阅。下面是一个演示,演示了使用
IObservable
和RX的最简单的发布/订阅模式

使用NuGet将被动扩展(RX)添加到您的项目中,搜索
RX main
,然后安装
Reactive Extensions-main Library

using System;
using System.Reactive.Subjects;

namespace RX_2
{
    public static class Program
    {
        static void Main(string[] args)
        {
            Subject<int> stream = new Subject<int>();

            stream.Subscribe(
                o =>
                {
                    Console.Write(o);
                });

            stream.Subscribe(
                o =>
                {
                    Console.Write(o);
                });

            for (int i = 0; i < 5; i++)
            {
                stream.OnNext(i);
            }

            Console.ReadKey();
        }
    }
}

为了编译此代码,您必须使用NuGet将RX添加到您的解决方案中。为了编译此代码,您必须使用NuGet将RX添加到您的解决方案中。