C# 创建后推送新值

C# 创建后推送新值,c#,system.reactive,C#,System.reactive,在阅读网站时,它不鼓励使用主语而支持观察。创建助手方法 正如我所看到的,OnNext方法只能被调用到subscribe方法中,因为它是我唯一可以访问Observer对象的部分 如果我想在它创建之后推动新的价值观呢? 我是被迫使用某个主题的吗?如果你只是在探索Rx,那么就开始使用它——使用主题,发疯,看看它们是如何工作的,为自己发现它们的优点和缺点,然后回到这里,阅读讨论主题为何不受欢迎的问题 主题提供了一种更简单的方法来快速引导想法和复杂的接收场景,而无需复制实际的源条件 这就是说,它们确实将状

在阅读网站时,它不鼓励使用主语而支持观察。创建助手方法

正如我所看到的,OnNext方法只能被调用到subscribe方法中,因为它是我唯一可以访问Observer对象的部分

如果我想在它创建之后推动新的价值观呢?
我是被迫使用某个主题的吗?

如果你只是在探索Rx,那么就开始使用它——使用主题,发疯,看看它们是如何工作的,为自己发现它们的优点和缺点,然后回到这里,阅读讨论主题为何不受欢迎的问题

主题提供了一种更简单的方法来快速引导想法和复杂的接收场景,而无需复制实际的源条件

这就是说,它们确实将状态注入到所谓的无状态操作链中,所以小心不要依赖它们

所以,总结一下:如果您试图生成序列来测试/了解rx是如何工作的,或者如何进行查询X,请使用这些主题。如果您发现自己在查询中使用它们,那么有可能有更好的方法

编辑:意识到我遗漏了什么:

此外,您还询问是否有其他方法在创建后引发流事件……答案是肯定的;您可以通过Create或Return或Generate声明流,该流返回您定义的任何旧的基于IObservable的对象,也可以公开用于注入事件的方法……或者,使用lambda旋转线程,检查路由到返回流的共享列表……我想我要说的是,可能性是无穷的。有十几种方法可以创建在Observable上声明的事件序列方法—请全部尝试

编辑2:

举个例子?当然,让我们使用Observable来组合一些东西。创建一个模仿一个非常低效的主题:


请注意,这只是一个快速且非常脏的示例代码:

如果你只是在探索Rx,那么就去探索它——使用主题,发疯,看看它们是如何工作的,自己发现它们的优点和缺点,然后回到这里,阅读讨论主题为何不受欢迎的问题

主题提供了一种更简单的方法来快速引导想法和复杂的接收场景,而无需复制实际的源条件

这就是说,它们确实将状态注入到所谓的无状态操作链中,所以小心不要依赖它们

所以,总结一下:如果您试图生成序列来测试/了解rx是如何工作的,或者如何进行查询X,请使用这些主题。如果您发现自己在查询中使用它们,那么有可能有更好的方法

编辑:意识到我遗漏了什么:

此外,您还询问是否有其他方法在创建后引发流事件……答案是肯定的;您可以通过Create或Return或Generate声明流,该流返回您定义的任何旧的基于IObservable的对象,也可以公开用于注入事件的方法……或者,使用lambda旋转线程,检查路由到返回流的共享列表……我想我要说的是,可能性是无穷的。有十几种方法可以创建在Observable上声明的事件序列方法—请全部尝试

编辑2:

举个例子?当然,让我们使用Observable来组合一些东西。创建一个模仿一个非常低效的主题:


请注意,这只是一个快速且非常脏的示例代码:

这取决于你想做什么。受试者也有这样的情况,但只是不像人们第一次开始服用Rx时想象的那么多

新数据将如何输入您的序列?它会来自另一个事件吗?也许是来自通信框架的信息?也许是轮询文件

根据这些答案,您通常会发现您已经有了某种事件源,并且您正在从另一种模式事件、轮询、回调等转换为Rx

您也不必只使用Observable.Create。您可以使用Observable.Timer/Interval设置轮询序列Observable.FromEventPattern以利用现有事件Observable.Start进行一次性异步任务样式计算等


由于Rx甚至Linq可能非常抽象,提出抽象的问题通常可以得到非常广泛的答案。如果你给出一个你试图解决的问题的提示,这可能会帮助你提供更好的答案。

这取决于你想做什么。受试者也有这样的情况,但只是不像人们第一次开始服用Rx时想象的那么多

新数据将如何输入您的序列?它会来自另一个事件吗?也许是来自通信框架的信息?也许是轮询文件

根据这些答案,您通常会发现您已经有了某种事件源,并且您正在从另一种模式事件、轮询、回调等转换为Rx

你也不仅仅有 使用Observable.Create。您可以使用Observable.Timer/Interval设置轮询序列Observable.FromEventPattern以利用现有事件Observable.Start进行一次性异步任务样式计算等


由于Rx甚至Linq可能非常抽象,提出抽象的问题通常可以得到非常广泛的答案。如果您给出了一个您试图解决的问题的指示,这可能有助于为您提供更好的答案。

如果您从外部设备接收数据,您不打算用IObserver发出错误信号。或者您假设您的流是无止境的和/或任何通信问题都在消息本身内,以某种速率进行轮询时,Subject的唯一问题是,您可能会在任何人订阅之前就开始轮询此设备,但额外的好处是,处理您的状态非常明显,您创建了一个对象,它打开COM端口,它通信并发布值


使用Observable.Create或Observable.Timer/Interval可能会更好——但懒惰是主要原因,您无论如何都会管理状态。并且您可能需要使用Publish.RefCount来防止第二次订阅打开端口。

如果您从外部设备接收数据,您不打算用IObserver发出错误信号。如果您假设流是无止境的,并且/或者消息本身存在通信问题,您将以某种速率进行轮询,Subject唯一的问题是,您可能会在任何人订阅之前就开始轮询此设备,但额外的好处是处理您的状态非常明显,您创建了一个对象,它打开COM端口,它通信并发布值



使用Observable.Create或Observable.Timer/Interval可能会更好——但懒惰是主要原因,您无论如何都会管理状态。您可能需要使用Publish.RefCount来阻止第二个订阅打开端口。

详细说明您试图实现的目标。如果您只是处理其他源的事件,数据重新处理并向前传递,则需要依赖于您正在“推送”的内容(稍微简化),那个么这个主题就可以避免了,这条线有点“细”,你们可能不会想,但一些外部来源通常就在那个里。如果你真的在制作自己的“feed”,例如消息,而不是明显的外部来源,那么这个主题迟早会成为一个解决方案。有关详细信息,最好检查实际接收源,看看“原始创建者”是如何解决某些问题的。更多地解释您试图实现的目标取决于您正在“推动”的内容—稍微简化—如果您只是处理其他源的事件,数据将重新处理并向前传递,那个么这个主题就可以避免了,这条线有点“细”,你们可能不会想,但一些外部来源通常就在那个里。如果你真的在制作自己的“feed”,例如消息,而不是明显的外部来源,那么这个主题迟早会成为一个解决方案。有关详细信息,最好检查实际接收源,看看“原始创造者”是如何解决一些问题的。是的,这就是他所说的,我认为——落入另一个IObservable有点像鸡和蛋:-涉及共享列表就是添加状态-如果你有一些东西需要“发布”,或者你需要一个状态作为你来做什么的一种性质,我想说的是归结到类似的解决方案。可观察。创建我完全同意你先探索其他事情,但一开始就很难做到。你可以发布一个简单的示例,介绍创建后推送新数据吗?@Vincenzo当然,只是添加了一个快速的例子是的,这就是他所说的,我认为-陷入另一个IObservable是一种鸡和蛋:-涉及共享列表就是添加状态-我想说的是,如果你有一些东西需要“发布”,或者你需要一个状态是你所做的事情的一种性质,那么你可以归结为类似的解决方案。可观察。创建我完全同意你先探索其他事情,但一开始就很难做到。你可以发布一个简单的示例,介绍创建后推送新数据吗?@Vincenzo当然,只是添加了一个快速示例源代码非常简单:我有几个设备连接到网络或串行通信,每X分钟我获取它们的状态和相关数据,如果不等于前一个,则按一下。那么你轮询设备了吗?如果是这样,那么我将利用调度器或Observable.Timer。我想我有足够的信息来编写一些代码和开始测试。非常感谢您的帮助,很抱歉再次打扰您,但有点不对劲!Interval and timer function生成自动可观测值,每次整数递增…我想提供我的自定义值!那很酷。尝试使用“选择”将整数映射到自定义值。你可以这样做。选择i=>myArray[i]或一起忽略整数。选择_u=>_factory.CreateThing或-.Sel
ect \=>bluetooth.GetStatus。这将允许您以恒定速率获取自定义值,该速率基于您提供给计时器/间隔方法的值。源代码非常简单:我有几个设备连接到网络或串行通信,每X分钟获取它们的状态和相关数据,如果不等于上一个,则推送。因此,您轮询设备?如果是这样,那么我将利用调度器或Observable.Timer。我想我有足够的信息来编写一些代码和开始测试。非常感谢您的帮助,很抱歉再次打扰您,但有点不对劲!Interval and timer function生成自动可观测值,每次整数递增…我想提供我的自定义值!那很酷。尝试使用“选择”将整数映射到自定义值。你可以这样做。选择i=>myArray[i]或一起忽略整数。选择\u=>\ u factory.CreateThing-或-。选择\u=>bluetooth.GetStatus。然后,这将允许您根据给定给计时器/间隔方法的值以恒定速率获取自定义值
var running = true;
var values = new ConcurrentQueue<int>();
var query = Observable.Create<int>(obs =>
{
    var body = Task.Factory.StartNew(()=>
    {
        while(running)
        {
            int nextValue;
            if(values.TryDequeue(out nextValue))
            {
                obs.OnNext(nextValue);
            }
            Thread.Yield();
        }
    });
    return Disposable.Create(() =>
    {
        try
        {
            running = false;
            body.Wait();
            obs.OnCompleted();            
        }
        catch(Exception ex)
        {
            obs.OnError(ex);
        }
    });
});
using(query.Subscribe(Console.WriteLine))
{
    values.Enqueue(1);
    values.Enqueue(2);
    values.Enqueue(3);
    values.Enqueue(4);
    Console.ReadLine();
}